C++ C++;删除[]-如何检查“是否”;“全部删除”吗;?

C++ C++;删除[]-如何检查“是否”;“全部删除”吗;?,c++,memory,heap,allocation,delete-operator,C++,Memory,Heap,Allocation,Delete Operator,我想知道,在整个程序中,我使用了很多指向cstring的char*指针和其他指针。 我希望确保在程序完成后删除所有指针,即使Visual Studio和代码块都为我这样做(我想..) 是否有办法检查所有内存是否已清除?没有任何东西仍然在“使用内存” 我想知道,在整个程序中,我使用了很多指向cstring的char*指针 为什么??我每天编写C++代码,我很少使用指针。实际上,只有在使用第三方API时,我才能在一定程度上解决这个问题。并不是指针本身就是坏的,但是如果你能避免它们,就要尽量简化你的程

我想知道,在整个程序中,我使用了很多指向
cstring
char*
指针和其他指针。 我希望确保在程序完成后删除所有指针,即使Visual Studio和代码块都为我这样做(我想..)

是否有办法检查所有内存是否已清除?没有任何东西仍然在“使用内存”

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

为什么??我每天编写C++代码,我很少使用指针。实际上,只有在使用第三方API时,我才能在一定程度上解决这个问题。并不是指针本身就是坏的,但是如果你能避免它们,就要尽量简化你的程序

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

这是一个毫无意义的练习。当操作系统清理你的进程时,它会为你做这件事

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

为什么??我每天编写C++代码,我很少使用指针。实际上,只有在使用第三方API时,我才能在一定程度上解决这个问题。并不是指针本身就是坏的,但是如果你能避免它们,就要尽量简化你的程序

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


这是一个毫无意义的练习。当操作系统清理您的进程时,它会为您做这件事。

在Linux上最明显的答案是valgrind,但是VS提到的让我觉得您是在Windows上。是一个讨论valgrind windows替代方案的热门话题。

Linux上最明显的答案是valgrind,但是VS的提及让我觉得你是在windows上。是一个讨论windows替代方案的超线程。

Visual Studio是一个IDE。在部署代码时,它甚至还不存在。它不会为你释放内存

对于您想要的,您可以查看以下工具:


Visual Studio是一个IDE。在部署代码时,它甚至还不存在。它不会为你释放内存

对于您想要的,您可以查看以下工具:


您可能希望使用某种智能指针(例如,请参阅)。其思想是,您不必手动管理内存(即在不再需要对象时显式调用delete),而是利用的能力为您完成这项工作

手动内存管理(以及一般的资源管理)的问题在于,很难编写一个正确释放所有内存的程序——因为您忘记了,或者以后更改代码时,没有意识到还有其他内存需要释放

C++中的P>Raii充分利用了一个事实,即当对象超出范围时,自动分配调用堆栈对象的析构函数。如果析构函数逻辑编写正确,那么引用(管理)动态分配的数据的最后一个对象将是(也是唯一一个)解除分配该内存的对象。这可以通过引用计数、维护引用列表等方式实现


内存的RAII范例在某种意义上类似于mamged语言的垃圾收集,只是它在需要时运行,并由代码指定,而不是在一定的时间间隔内运行,基本上与代码无关。

您可能需要使用某种智能指针(例如,请参阅)。其思想是,您不必手动管理内存(即在不再需要对象时显式调用delete),而是利用的能力为您完成这项工作

手动内存管理(以及一般的资源管理)的问题在于,很难编写一个正确释放所有内存的程序——因为您忘记了,或者以后更改代码时,没有意识到还有其他内存需要释放

C++中的P>Raii充分利用了一个事实,即当对象超出范围时,自动分配调用堆栈对象的析构函数。如果析构函数逻辑编写正确,那么引用(管理)动态分配的数据的最后一个对象将是(也是唯一一个)解除分配该内存的对象。这可以通过引用计数、维护引用列表等方式实现


内存的RAII范例在某种意义上类似于mamged语言的垃圾收集,只是它在需要时运行,并由代码指定,而不是以一定的时间间隔运行,在很大程度上独立于代码。

除非您正在编写驱动程序代码,对于heap/freestore分配的内存,您绝对不能做任何事情,一旦程序终止,就会导致它继续泄漏。泄漏内存只是给定进程生命周期内的一个问题;一旦某个特定进程泄漏了其全部地址空间,它就无法再为该进程获取更多地址

并不是你的编译器在做最终的清理,而是操作系统。在所有支持隔离进程地址空间的现代操作系统中(即一个进程不能读/写另一个进程的地址空间,至少在没有操作系统协助的情况下),当程序终止时,无论程序是否完全空闲()释放或删除其所有堆/释放存储分配的内存。您可以很容易地对此进行测试:编写一个分配256 MB空间的程序,然后在不释放/删除分配的内存的情况下正常退出或返回。然后运行程序16次(或更多)。开枪,跑1000次。如果在没有释放内存的情况下退出,导致它在重新启动之前被遗忘,那么很快就会耗尽可用内存。你会发现情况并非如此

这是
_CrtSetDbgFlag(_crtDbgFlag | _CRTDBG_LEAK_CHECK_DF);
#include <crtdbg.h>