Posted on 2011-03-29 17:16
點點滴滴 閱讀(272)
評論(0) 編輯 收藏 引用 所屬分類:
02 編程語言
今天有同事碰到了這個Warning:
Warning C4150
Deletion of pointer to incomplete type 'type'; no destructor called
下面的代碼會導致這個問題:
class A;
A *pA = new A();
delete pA; // Warning C4150
|
這個Warning字面的意思是由于類型是不完全類型(Incomplete Type),因此destructor不會被調用。
其原因是由于前面使用前置聲明來聲明class A,此時class A并沒有完整的定義,編譯器只是把A加入到符號表并標記A為一個class,編譯器并不知道更多的信息,比如A的大小,有何成員函數等等。在以一般情況下,如果我們只用到A的指針,在特定平臺下A的指針大小固定,因此編譯器不會報任何錯誤。然而,在調用delete來刪除pA的時候,編譯器可以知道pA所指的內存大小,因為內存分配器在內存塊中保存了大小信息,可以正確釋放A所占據的內存。但是,由于A是Incomplete Type,編譯器無法知道A所對應的析構函數(destructor),因此不會調用A的析構函數。
解決方法很簡單,#include A所在的頭文件即可,如果忘記了#include,則會出現此Warning。
當然了,還有一種情況是你已經在某個地方調用過A的析構函數了(這種情況不太常見),在這里只需要釋放內存即可,所以可以這么寫:
class A;
A *pA = new A();
delete (void *)pA;
|