2013-07-28 38 views
13

Tôi có đoạn mã sau:Mối quan hệ giữa Forward khai và destructor

#include <iostream> 
using namespace std; 

class CForward; 

void func(CForward* frw) { delete frw; } 

class CForward 
{ 
public: 
    ~CForward() { cout << "Forward" << endl; } 
}; 

int main() 
{ 
    func(new CForward); 
    cin.get(); 
} 

tôi chạy chương trình, và nó in gì cả.

Tại sao?

trong chính, tôi đã tạo new CFoward và trong func Tôi đã xóa nó và gọi đó là hàm hủy.

Dường như trình hủy không được gọi. Tại sao? Đó có phải là liên quan đến việc giải mã về phía trước không?

+0

'g ++' thực sự cho bạn biết điều gì đang xảy ra khi bạn biên dịch mã này. – fuenfundachtzig

+2

Ít nhất là tăng mức cảnh báo trên trình biên dịch của bạn. Điều này sẽ luôn luôn phát ra chẩn đoán "xóa con trỏ đến loại không đầy đủ". –

+0

GCC khá hữu ích: 'cảnh báo: có thể phát hiện vấn đề trong yêu cầu xóa toán tử: [được bật theo mặc định] 'frw' có loại chưa hoàn thành [được bật theo mặc định] khai báo trước của 'class CForward' [enabled by default] note: not the destructor cũng như xóa toán tử lớp cụ thể sẽ được gọi, ngay cả khi chúng được khai báo khi lớp được định nghĩa'. – juanchopanza

Trả lời

12

Thật vậy, lời tuyên bố mong bạn giới thiệu một loại không đầy đủ mà sau này được xác định với một destructor không tầm thường, và không thể được sử dụng trong một biểu thức xóa:

Từ n3337, đoạn 5.3.5/5:

5 Nếu đối tượng bị xóa có kiểu lớp đầy đủ tại thời điểm xóa và lớp hoàn chỉnh có một destructor không tầm thường hoặc một chức năng deallocation, hành vi được unde fi ned.

+3

@ user1798362: Nếu bạn đã xác định trình phá hủy lớp của bạn (thay vì chỉ sử dụng trình biên dịch được tạo ra), nó không quan trọng. Theo cách đệ quy, nếu lớp của bạn có bất kỳ thành viên nào có các destructor không tầm thường, lớp của bạn có một destructor không tầm thường. Tất cả các destructors khác là tầm thường (họ không thực sự làm bất cứ điều gì). –

1

Có. Trong thực tế trong hàm func, trình biên dịch không biết loại cForward hoàn chỉnh. Vì vậy, desctructor được neved gọi.

Nếu bạn đặt hàm sau lớp, nó sẽ hoạt động tốt.

Các vấn đề liên quan