如何在此代码中找到检测内存泄漏的方法?

时间:2012-04-24 15:16:23

标签: c++ visual-studio

全部,有没有人告诉我一个好的方法或工具来检测Visual Studio中这些代码的内存泄漏?我已经测试了crt调试,但是当我中止调试过程(shift + f5)时,内存泄漏报告没有出现在调试窗口中。

void fun1()
{
    int * pInt = new int;
    return;
}
void Execute(void)
{
    while(true)
    {
        cout<<"I will sleep for 1 second..."<<endl;
        ::Sleep(1000);
        fun1();
    }
    return;
}
int main()
{
    Execute();
    return 0;
}

任何人都知道如何找到上述代码的内存吗? 顺便说一句,如果我选择使用shared_ptr,内存泄漏不会再发生,对吗?

4 个答案:

答案 0 :(得分:1)

这里的问题非常简单:当你中止一个进程时,泄漏的内存或多或少被认为是理所当然的 - 即使你的代码通常不会泄漏,用调试器中止它是(没有非常好的运气)无论如何都会泄漏内存。因此,当您使用调试器中止程序时,大多数通常会报告内存泄漏的工具都不会。

因此,要查看泄漏报告,您只需要编写一些代码,这些代码在某些时候会自行退出,而不是要求您使用调试器将其删除。如果您将代码更改为以下内容:

void fun1()
{
    int * pInt = new int;
    return;
}
void Execute(void)
{
    for (int i=0; i<100000; i++)
    {
        //cout<<"I will sleep for 1 second..."<<endl;
        //::Sleep(2000);
        fun1();
    }
    return;
}
int main()
{
    Execute();
    return 0;
}

顺便说一下,当你将2000作为参数传递给Sleep时,你应该期望它至少睡2秒,而不只是一个。目前,我已经注释掉coutSleep,因此应该快速泄漏内存并生成泄漏报告。有了大量的输出和睡眠,它会做同样的事情,只是更加缓慢和吵闹。

答案 1 :(得分:0)

将此功能添加到主功能的顶部不起作用吗?

#if defined(DEBUG) | defined (_DEBUG)
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

您必须以调试模式运行。

答案 2 :(得分:0)

问题在于,当一个进程正在运行时,自动化进程很难分辨出哪些内存泄露了。在跟踪对象和内存块引用的语言中,您可以随时执行此操作,只需找到没有引用的块即可。在C / C ++中没有这样的东西(除非你自己实现它,所以),所以你无法确定内存块是否已经泄露。

在这种情况下,您可以做的一件事是触发在您知道不应该有任何泄漏的流程生命周期中的某个时间点转储内存泄漏的功能。例如,假设您知道在Execute()while循环中每次迭代结束时应用程序不应该有任何泄漏。然后你可以做这样的事情:

#include <crtdbg.h>

void fun1()
{
    int * pInt = new int;
    return;
}
void Execute(void)
{
    int i = 0;
    while(true)
    {
        cout<<"I will sleep for 1 second..."<<endl;
        ::Sleep(2000);
        fun1();

        #ifdef _DEBUG
        // dump any leaks every 100 iterations
        if (++i % 100 == 0)
            _CrtDumpMemoryLeaks();
        #endif
    }
    return;
}
int main()
{
    Execute();
    return 0;
}

有关_CrtDumpMemoryLeaks()和MSVC CRT库的其他功能的信息,请参阅this page

我希望这会有所帮助。

答案 3 :(得分:-1)

我不知道VS,在Linux上我会使用valgrind