我对C ++(以及一般的编程)比较陌生,所以如果问题不是很清楚,请原谅我。
我所拥有的是一个程序,其中创建了一个内部定义的类[我们称之为“class1”]的一定数量的对象。 该程序工作得非常好,对象可以做到他们应该做的事情。
我目前要解决的问题如下:在程序退出之前,这些对象不会被销毁(因此内存不会被解除分配),但我需要更早的内存。
在该类的其他成员中,有其他内部定义的类的对象(也有成员是第三类的对象)。
我的问题如下:如何为“class1”的对象正确定义析构函数,以便取消所有数据并释放内存?
我发现(可能这对你来说很明显)像
这样的析构函数class1::~class1(void) {
}
不起作用(我为所有内部定义的类定义了类似的析构函数)。
读到我知道我的错误可能是那个什么都不做的析构函数。我该如何解决这个问题?
感谢任何回答/帮助/评论的人。
费德里科
答案 0 :(得分:12)
在C ++中,您需要手动释放内存。没有垃圾收集器。你显然需要在析构函数中手动释放内存。如果您使用 new 分配了内存,则需要对解析器中使用 new 分配的每个资源使用 delete ,例如:
class1::~class1(void)
{
delete resource1;
delete resource2;
etc...
}
答案 1 :(得分:3)
如果要动态分配内存,则需要在析构函数中释放它,但更好的解决方案是使用一些智能指针来保存动态数据 - std::auto_ptr
或std::shared_ptr
。然后你不需要显式释放内存 - 这将在智能指针析构函数中自动完成。
答案 2 :(得分:2)
堆栈上的内存
如果类中没有堆分配的对象,则无需显式定义类的析构函数。编译器生成的应该很好地处理这个工作,即调用基类对象和成员对象的析构函数等。
堆上的内存 - 手动内存管理
如果类中有任何堆分配的对象,则需要在析构函数中手动取消分配它们。确保在所有可能的退出点 正确地取消分配 ,例如,处理例外和取消分配资源。
堆上的内存 - RAII
或者,您可以使用一些明确定义的RAII类来自动处理资源管理,例如,Boost中的scoped_ptr
,scoped_array
,STL中的shared_ptr
等等。
答案 3 :(得分:2)
首先,您应该尝试在堆栈上分配对象:
Object obj;
所以你不必担心内存分配。缺点是物体寿命仅限于当前范围。
如果这对你不好,你应该考虑使用智能指针。如果这不是一个选项,请使用new
/ delete
来创建/销毁您的对象。但是你必须要小心,每个new
应该在某个时间点导致delete
。