C ++ delete [] - 如何检查“all is deleted”?

时间:2012-03-22 00:10:57

标签: c++ memory heap allocation delete-operator

我很想知道,在整个程序中我使用了很多char*指向cstrings的指针和其他指针。 我想确保在程序完成后删除所有指针,即使Visual Studio和Code Blocks都为我做了(我想......)。

有没有办法检查是否清除了所有内存?什么都没有'使用记忆'?

6 个答案:

答案 0 :(得分:3)

关于Linux的明显答案是valgrind,但VS提到让我觉得你在Windows上。 Here是一个讨论Windows的valgrind替代品的SO线程。

答案 1 :(得分:1)

  

我很想知道,在整个程序中我使用了很多关于cstrings的char *指针

为什么呢?我每天都在编写C ++代码,而且很少使用指针。真的只有在使用第三方API的时候,即便如此,我通常可以在某种程度上解决它。并非指针本质上是坏的,但如果你可以避免它们,那么这样做可以简化你的程序。

  

我想确保在程序完成后删除所有指针

这是一个毫无意义的练习。操作系统会在清理过程时为您完成。

答案 2 :(得分:1)

Visual Studio是一个IDE。在您的代码部署时,它甚至都没有。它不会为你释放记忆。

根据您的需要,您可以查看以下工具:

http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page

答案 3 :(得分:0)

您可能想要使用某种智能指针(例如,请参阅Boost library)。我们的想法是,不必手动管理内存(即当您不再需要该对象时显式调用删除),您需要RAII的强大功能为您完成工作。

手动内存管理(以及一般资源管理)的问题是很难编写一个正确释放所有内存的程序 - 因为你忘了,或者稍后当你更改代码时没有意识到还有其他的需要解除分配的内存。

C ++中的RAII利用了这样一个事实:当该对象超出范围时,会自动调用堆栈分配对象的析构函数。如果正确编写析构函数逻辑,则引用(管理)动态分配数据的最后一个对象将是释放该内存的那个(并且只有一个)。这可以通过引用计数,维护引用列表等来实现。

RAII内存范式在某种意义上类似于哺乳语言的垃圾收集,除非它在需要时运行并由您的代码决定,而不是以特定的时间间隔运行,大部分与您的代码无关。

答案 4 :(得分:0)

除非您正在编写驱动程序代码,否则您无法对堆/ freestore分配的内存执行任何操作,这会导致程序终止时保持泄漏状态。泄漏的内存只是给定进程生命周期中的一个问题;一旦某个特定进程泄露了整个地址空间,它就无法再为_that_particular_进程获取。

并不是你的编译器进行uiltimate清理,它是操作系统。在支持隔离进程地址空间的所有现代操作系统中(即,一个进程无法读取/写入另一个进程的地址空间,至少在没有OS辅助的情况下),当程序终止时,操作系统将回收进程的整个地址空间,该程序是否已干净地()编辑或删除其所有堆/ freestore分配的内存。您可以轻松地测试:编写一个分配256 MB空间的程序,然后退出或正常返回,而不释放/删除分配的内存。然后运行您的程序16次(或更多)。拍摄,运行1000次。如果在没有释放内存的情况下退出使其在重新启动之前泄漏,那么你很快就会耗尽可用内存。你会发现情况并非如此。

然而,对于某些其他类型的内存,这种粗心是不可接受的:如果您的程序持有任何“句柄”(一个标识操作系统授予该进程的某种资源的数字),在某些情况下如果在不释放句柄的情况下异常或不正常地退出程序,它们将一直丢失,直到下次重新启动。但是,除非你的程序调用操作系统函数给你这样的句柄,否则这不是一个问题。

答案 5 :(得分:0)

如果这是特定于Windows的,您可以在程序开始时调用它: -

_CrtSetDbgFlag(_crtDbgFlag | _CRTDBG_LEAK_CHECK_DF);

包括

之后
#include <crtdbg.h>

当你的程序退出C ++运行时,会向调试器输出仍然分配的所有内存块的列表,这样你就可以看到是否忘记了任何内容。

请注意,这只发生在DEBUG版本中,在RELEASE版本中,代码什么都不做(无论如何,这是probabyl你想要的)