C ++调用析构函数并不真正从内存中删除对象

时间:2014-05-03 22:13:54

标签: c++ memory memory-management destructor

我是C ++的新手,我正在开发应用程序,我使用new关键字MyObject* obj = new Object()在内存中分配了很多对象。在对它们进行一些操作之后(稍后会有一些代码行),我正在调用像delete obj这样的析构函数。但经过大量的迭代后,我注意到,存在巨大的内存消耗,显然这些对象并没有被破坏。所以我尝试了一个简单的例子:

Algorhitm* alg;
for (int o = 0; o < 500000000; o++)
{
    alg = new Algorhitm();
    alg->~Algorhitm();
}

还有delete alg,但似乎没有内存处理。内存消耗增加到临界点,然后它导致我的应用程序崩溃。有人可以向我解释一下,我做错了什么?我使用了称为C ++ Memory Validator的内存分析工具,并且在内存分配和处理的一些图表中,这只是分配,但没有这个工具识别的交易。

2 个答案:

答案 0 :(得分:3)

从不应直接使用~<destructor>函数调用析构函数!你应该打电话

delete alg;

或者依赖于被调用的析构函数和已分配的内存,这些内存是使用堆栈分配的类实例从范围中释放出来的。

析构函数的直接调用根本不会影响内存管理,在大多数情况下都是错误的(自定义delete实现很少需要)。

释放之前分配的内存 虽然您可能会看到数据结构仍然存在。在delete之后访问这些内容会导致任何情况下的未定义行为!

答案 1 :(得分:1)

我同意。除非析构函数调用delete或free(),否则调用析构函数并不会真正释放内存。

然后调用delete或free()会释放内存,但会回到堆中,而不是回到操作系统。