我将把这个问题作为 c/c++ 的序言,因为它主要与此有关,而且我已经看到它对 c/c++ 的影响最大。
这让我担心了一段时间,我知道这个问题有些是可以避免的(我想避免关于如何避免的讲座,而是专注于后果,以防万一发生),但我仍然会有潜在的问题。
初步想法:
指针只是用作指向内存中其他位置的对象的地址(这可能是因为需要修改该类型事物的数量int[]
,或者因为事物的性质可以在事物的整个生命周期内发生变化polymophism
)
无论何时使用关键字new
,它都应该有一个相应的关键字delete
(如果不是多个,取决于异常处理和多个退出点)
当通过关键字delete
对动态分配的内存块进行操作时,将调用析构函数(如果有,则执行其操作),将内存块返回到系统存储以供其他事物使用,并且(取决于编译器,宏,或程序员)设置指针NULL
以避免非法内存访问。
情况:
当我编写一个使用动态内存的程序时(pointers
、new
和的组合delete
)。如果发生某些事情,并且程序意外终止(未处理的异常、内存访问错误、非法操作等)。系统应该尝试删除程序正在使用的所有内存,并将其返回给系统,但指针并不总是被清除。这可能在操作系统和编译器之间有所不同(关于如何执行程序终止),但是被指向的东西可能仍然存在于内存中,因为被删除的只是指针,而不是被指向的东西。当然这可能是非常小的损失(对于一个小程序来说,小于一个 MB,但是对于说对数据存储进行压力测试或处理大文件,这可能会非常大,甚至可能在 GB 范围内。
直接的问题是可以采取哪些步骤来恢复记忆?我发现唯一可行的方法是重新启动系统(这是在 Windows 系统上使用 g++ 和 VS2008/2010 时)