#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <crtdbg.h>
#define _CRTDBG_MAP_ALLOC
using namespace std;
int main(void){
string file = "hello";
string foo;
char response;
_CrtDumpMemoryLeaks();
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
return 0;
}
只是一个小小的自包含示例。控制台将显示:
Detected memory leaks!
Dumping objects ->
{143} normal block at 0x007DAE50, 8 bytes long.
Data: < B > 18 FB 42 00 00 00 00 00
{142} normal block at 0x007DAE08, 8 bytes long.
Data: << B > 3C FB 42 00 00 00 00 00
跑完之后。这是CRT无法正确处理字符串的问题吗?
答案 0 :(得分:1)
这是因为您在_CrtDumpMemoryLeaks
返回之前致电main
,因此字符串尚未超出范围。您应该仅在释放字符串后检查泄漏,例如:
void myFunc() {
string file = "hello";
string foo;
char response;
}
int main(void){
myFunc();
_CrtDumpMemoryLeaks();
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
return 0;
}
答案 1 :(得分:1)
我认为这会解决它:
int main(void){
{
string file = "hello";
string foo;
char response;
} // file's destructor called here
_CrtDumpMemoryLeaks();
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
return 0;
}
因为这些字符串只会在main
函数的末尾删除,因此在调用_CrtDumpMemoryLeaks()
函数时仍然会在范围内(因此拥有堆内存)。
答案 2 :(得分:1)
_CrtDumpMemoryLeaks();
在字符串析构函数可以运行之前,您要求泄漏报告。在此声明之前在代码周围添加花括号将是一种解决方法。
但是你只是帮助太多,它在main()返回后已经生成泄漏报告。所以只需删除该语句即可。然后添加auto leak = new int;
,以便您看到真正的泄漏。