您调用的时间点_CrtDumpMemoryLeaks
很重要,因为所有使用的内存可能尚未释放。例如在下面的示例中,如果您在超出范围_CrtDumpMemoryLeaks()
之前调用它已分配的任何内存都将包含在泄漏内存列表中。listPtrs
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <vector>
int main()
{
std::vector<struct Foo*> listPtrs;
_CrtDumpMemoryLeaks();
return 0;
}
在下面的示例中listPtrs
,在调用之前超出范围,_CrtDumpMemoryLeaks
因此它分配的任何内存都将被释放,并且不会在泄漏的内存块中列出。
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <vector>
int main()
{
{
std::vector<struct Foo*> listPtrs;
}
_CrtDumpMemoryLeaks();
return 0;
}
同样,如果您在 main 返回_CrtDumpMemoryLeaks
后std::vector
调用,则应释放分配的任何资源。这再次是因为listPtrs
现在已经超出范围并且std::vector
已经调用了析构函数。
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <vector>
// Call _CrtDumpMemoryLeaks after main has returned and before program terminates.
struct AtExit
{
~AtExit() { _CrtDumpMemoryLeaks(); }
} doAtExit;
int main()
{
std::vector<struct Foo*> listPtrs;
return 0;
}
我强烈建议使用智能指针而不是裸指针。它让它们在冬天保持温暖,您不必担心使用delete
.
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <vector>
#include <memory>
// Call _CrtDumpMemoryLeaks after main has returned and before program terminates.
struct AtExit
{
~AtExit() { _CrtDumpMemoryLeaks(); }
} doAtExit;
int main()
{
std::vector<std::unique_ptr<struct Foo*>> listPtrs;
return 0;
}