-1

我将把这个问题作为 c/c++ 的序言,因为它主要与此有关,而且我已经看到它对 c/c++ 的影响最大。

这让我担心了一段时间,我知道这个问题有些是可以避免的(我想避免关于如何避免的讲座,而是专注于后果,以防万一发生),但我仍然会有潜在的问题。

初步想法:

指针只是用作指向内存中其他位置的对象的地址(这可能是因为需要修改该类型事物的数量int[],或者因为事物的性质可以在事物的整个生命周期内发生变化polymophism

无论何时使用关键字new,它都应该有一个相应的关键字delete(如果不是多个,取决于异常处理和多个退出点)

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

情况:

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

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

4

2 回答 2

4

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

于 2012-04-27T05:58:25.237 回答
1

堆绑定到分配器,分配器绑定到进程。当进程退出时,堆被撤消。只有系统共享的资源不会被释放。

于 2012-04-27T05:58:57.510 回答