Visual C++在我的代码中发现内存泄漏,所以我把它缩小到尽可能最简单的测试用例并得到了这个:
#define _CRTDBG_MAP_ALLOC // required
#include <stdlib.h> // to enable MSVC++
#include <crtdbg.h> // memory leak detection
#include <string>
using namespace std;
int main() {
string foo;
_CrtDumpMemoryLeaks();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Detected memory leaks!
Dumping objects ->
{130} normal block at 0x008748A8, 8 bytes long.
Data: B4 F9 44 00 00 00 00 00
Object dump complete.
如果我评论出"string foo"; 它没有检测到任何东西.
我应该以某种方式取消分配foo吗?
sha*_*oth 12
你运行_CrtDumpMemoryLeaks()得太早,它报告string身体是泄漏.只有在所有本地对象都被销毁后才能运行它.
将所有有意义的工作包装在一个单独的函数中
void doStuff()
{
string variable;
}
Run Code Online (Sandbox Code Playgroud)
或添加嵌套范围:
int main()
{
{
string variable;
}
_CrtDumpMemoryLeaks();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Shi*_*nok 10
程序/块终止后应该调用_CrtDumpMemoryLeaks.最好的方法是在程序终止时调用CRT,如_CrtDumpMemoryLeaks msdn文章中所述:
在程序执行结束时经常调用_CrtDumpMemoryLeaks以验证应用程序分配的所有内存是否已被释放.通过使用_CrtSetDbgFlag函数打开_crtDbgFlag标志的_CRTDBG_LEAK_CHECK_DF位字段,可以在程序终止时自动调用该函数.
通过以你的方式调用它,它将检测foo为泄漏,因为它的析构函数尚未被调用,因为执行块尚未结束.