程序终止于堆上的动态内存

时间:2012-04-27 05:55:34

标签: c++ c dynamic-memory-allocation

我将这个问题加入到c / c ++中,因为它主要与此有关,我发现它对c / c ++的影响最大。

这让我关心了一段时间,而且我理解这个问题可以避免(我想避免关于避免方法的讲座,而是关注后果,以防它确实发生),但是我仍然有潜在的问题。

最初的想法:

指针只是作为内存中某个对象的地址(这可能是因为需要修改该类型的事物的数量int[],或者因为事物的性质可能会在整个事物的生命期polymophism

只要使用关键字new,它就应该有一个对应的关键字delete(如果不是多个,取决于异常处理和多个退出点)

当关键字delete对动态分配的内存块执行操作时,将调用析构函数(如果有,则执行其操作),将内存块返回到系统存储区以使其可用于其他事物,和(取决于编译器,宏或程序员)指针设置为NULL以避免非法内存访问。

情况:

当我编写使用动态内存的程序时(pointersnewdelete的组合)。如果发生了什么,程序意外终止(未处理的异常,内存访问错误,非法操作等)。系统应该尝试删除程序正在使用的所有内存,并将其返回给系统,但指针并不总是被清除。这可能因操作系统和编译器(关于如何执行程序终止)而有所不同,但指向的内容可能仍然存在于内存中,因为删除的所有内容都是指针,而不是指向的内容。这可能是一个非常小的损失(对于一个小程序来说不到一MB),但是对于压力测试一个数据存储,或者处理大文件,即使在GB范围内也可能非常大。

直接的问题是可以采取哪些步骤来恢复记忆?我发现唯一有效的方法就是重新启动系统(这是在Windows系统上使用g ++和VS2008 / 2010时)

2 个答案:

答案 0 :(得分:4)

如果程序终止,则它正在使用的所有内存都将返回给系统。至少在你说你正在使用的Windows下。如果您认为这种情况没有发生,那么您的程序可能根本就没有终止。

答案 1 :(得分:1)

堆绑定到分配器,分配器绑定到进程。当进程退出时,堆就会撤消。只有系统共享资源才能解除分配。