您需要釋放析構函數中的所有動態分配的內存。這不會自動完成。
你的類包含兩個指針,並且基本上無法控制這些指向的內容。事實上,這些可能指向你不能刪除,例如對象:
struct Foo {};
struct Bar {
Foo* f_;
Foo(Foo* f) : f(f_) {}
};
int main() {
Foo f;
Bas b(&f); // b has a Foo ptr, but should it delete it?
}
所以你可以看到,它並沒有真正意義的指針數據成員被自動刪除。
作爲一般規則,如果你的班級管理資源,那麼你應該照顧複製建設和分配;這意味着,如果這對於類是有意義的,您應該禁用它們,或者爲它們提供實現,因爲編譯器生成的不起作用。有關此主題的詳細討論,請參閱the rule of three,並在計算器廣泛的討論:
如果不遵守這個規則,那麼默認的拷貝構造函數和賦值操作將生成一個淺拷貝,並且你將有多於一個的實例指向相同的動態分配的對象,這些對象將在銷燬後嘗試刪除。
您可以避免使用smart pointers手動刪除使用new
創建的對象。在你的情況,其中類顯然擁有動態分配的對象,你應該看看C++ 11的std::unique_ptr或boost::scoped_ptr
最後,你才能真正避免避免指針所有內存管理的問題都在一起,除非你真的需要。您可以將您的char*
由std::string
例如更換:
class test{
std::string p;
SomeClass someObject;
//test() : someObject() {} // default construction is probably OK...
};
1。也就是說,它分配和釋放內存,或打開和關閉網絡連接,或者創建和銷燬互斥體等。
他需要禁用複製語義或手動實施它們。 – Nawaz
@Nawaz謝謝。添加了三個wiki的規則鏈接。 – juanchopanza
可能值得建議你應該避免手動內存管理,如果可以的話,OP的代碼讓我聞到C和Java的混合。 – Arafangion