您需要释放析构函数中所有动态分配的内存。这不会自动完成。
您的类包含两个指针,并且基本上无法控制这些指向的内容。事实上,这些可能指向您不允许删除的对象,例如:
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?
}
所以你可以看到自动删除指针数据成员并没有什么意义。
作为一般规则,如果您的班级管理资源1,那么您应该注意副本构建和分配;这意味着,如果这对类有意义,您应该禁用它们,或者为它们提供实现,因为编译器生成的那些不起作用。有关此主题的详细讨论,请参阅三的规则,以及有关 stackoverflow 的广泛讨论:
如果您不遵循此规则,那么默认的复制构造函数和赋值操作将进行浅拷贝,并且您将拥有多个实例具有指向相同动态分配对象的指针,它们都会在销毁时尝试删除。
您可以避免手动删除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.即分配和释放内存,或者打开和关闭网络连接,或者创建和销毁互斥体等等。