0

所有,有谁能告诉我一种好方法或工具来检测 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

4 回答 4

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 秒,而不仅仅是一秒。目前,我已经注释掉了coutand Sleep,所以它应该只是快速泄漏内存并生成泄漏报告。有很多输出和睡眠,它会做同样的事情,只是更慢更嘈杂。

于 2012-04-24T15:25:57.713 回答
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 库的其他函数的信息,请参阅此页面

我希望这有帮助。

于 2012-04-24T15:36:23.680 回答
0

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

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

您必须在调试模式下运行。

于 2012-04-24T15:18:49.120 回答
-1

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

于 2012-04-24T15:19:36.587 回答