我是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的内存分析工具,并且在内存分配和处理的一些图表中,这只是分配,但没有这个工具识别的交易。
答案 0 :(得分:3)
你从不应直接使用~<destructor>
函数调用析构函数!你应该打电话
delete alg;
或者依赖于被调用的析构函数和已分配的内存,这些内存是使用堆栈分配的类实例从范围中释放出来的。
析构函数的直接调用根本不会影响内存管理,在大多数情况下都是错误的(自定义delete
实现很少需要)。
将释放之前分配的内存
虽然您可能会看到数据结构仍然存在。在delete
之后访问这些内容会导致任何情况下的未定义行为!
答案 1 :(得分:1)
我同意。除非析构函数调用delete或free(),否则调用析构函数并不会真正释放内存。
然后调用delete或free()会释放内存,但会回到堆中,而不是回到操作系统。