如果在main中使用字符串,为什么CRT会返回8字节的泄漏?

时间:2015-11-07 19:46:31

标签: c++ windows

#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无法正确处理字符串的问题吗?

3 个答案:

答案 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;,以便您看到真正的泄漏。