为什么这段代码不会导致内存泄漏?

时间:2014-03-13 03:28:17

标签: c++ c memory-leaks perfmon

我想在我的应用程序中模拟内存泄漏。我编写以下代码,并尝试在 perfmon 中查看。

int main()
{
    int *i;
    while(1)
    {

        i = (int *) malloc(1000);

        //just to avoid lazy allocation
        *i = 100;

        if(i == NULL)
        {
            printf("Memory Not Allocated\n");
        }

        Sleep(1000);
    }
}

当我在任务管理器中看到使用过的内存时,它在52K和136K之间波动,但不会超过它。手段,它显示52K,有时136K,我不明白这个代码一旦达到136K,回到52K,并没有超越它。

我尝试使用 perfmon ,但无法准确地在 perfmon 中看到什么,计数器的快照, enter image description here

请建议如何模拟内存泄漏以及如何检测它。

2 个答案:

答案 0 :(得分:10)

虽然操作系统可能会推迟动态分配的内存的实际分配,直到使用它为止,但编译器优化器可能会消除仅写入并且从不读取的分配。因为您的写入没有明确定义的可观察行为(您从未从中读取过),编译器可能会很好地优化它。我建议检查生成的汇编代码,看看编译器实际生成了什么。真的,这应该是回答问题的第一步,例如"为什么这段代码不像我认为的那样?"。

答案 1 :(得分:3)

严格来说,内存泄漏有点依赖于上下文:程序中的某些内容会随着时间的推移不断分配内存而不释放内存,应该已经释放

您的代码会在每次后续遍历while循环时产生“泄漏”,因为您的程序在该点失去了先前分配的指针的知识。这仅在检查中可见,但在这种情况下;从发布的代码来看,它看起来更像是你实际上正在尝试创建内存压力情况,但实际上非常缓慢。

要在没有检查的情况下“找到”泄漏,您需要运行valgrind(Unix / Linux / OSX)之类的工具,或者在Visual Studio中使用DEBUG_NEW宏启用allocation tracing并使用以下命令查看输出调试器。

如果确实想要匆忙压缩内存,请一次分配1024 x 1024 x 1024字节......