代码之家  ›  专栏  ›  技术社区  ›  Pranit Kothari

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

  •  6
  • Pranit Kothari  · 技术社区  · 12 年前

    我想在应用程序中模拟内存泄漏。我写了以下代码,并试图查看 性能监控 .

    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,而不是超出这个范围的。

    我试着用 性能监控 ,但无法确切看到什么 性能监控 ,计数器快照, enter image description here

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

    2 回复  |  直到 12 年前
        1
  •  10
  •   Nathan Ernst    12 年前

    虽然操作系统可能会延迟动态分配内存的实际分配,直到它被使用,但编译器优化器可能会消除仅写入而从不读取的分配。因为您的写入没有定义良好的可观察行为(您从未从中读取),所以编译器很可能会对其进行优化。我建议检查生成的汇编代码,看看编译器实际生成的是什么。真的,这应该是回答诸如“为什么这个代码的行为不像我认为的那样?”之类问题的第一步。

        2
  •  3
  •   6EQUJ5    12 年前

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

    您的代码在每次后续通过while循环时都会产生一个“泄漏”,因为您的程序在这一点上失去了先前分配的指针的知识。这仅通过检查可见,但在这种情况下;从发布的代码来看,你实际上在做的事情,虽然非常缓慢,但却在试图制造记忆压力。

    要在不检查的情况下“发现”泄漏,您需要运行以下工具 valgrind (Unix/Linux/OSX)或在Visual Studio中启用 allocation tracing 使用DEBUG_NEW宏,并使用调试器查看输出。

    如果你 真正地 想在匆忙中增加内存,一次分配1024 x 1024 x 1024字节。。。