C ++空程序内存泄漏

时间:2017-03-18 18:44:06

标签: c++ memory g++ valgrind

考虑以下代码

int main(){
    return 0;
}

我用g ++编译它并将输出传递给valgrind。输出如下。

==11752== HEAP SUMMARY:
==11752==     in use at exit: 72,704 bytes in 1 blocks
==11752==   total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==11752== 
==11965== LEAK SUMMARY:
==11965==    definitely lost: 0 bytes in 0 blocks
==11965==    indirectly lost: 0 bytes in 0 blocks
==11965==      possibly lost: 0 bytes in 0 blocks
==11965==    still reachable: 72,704 bytes in 1 blocks
==11965==         suppressed: 0 bytes in 0 blocks

但是,使用gcc在C中编译相同的代码会产生这个valgrind输出:

==11771== HEAP SUMMARY:
==11771==     in use at exit: 0 bytes in 0 blocks
==11771==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==11771== 
==11771== All heap blocks were freed -- no leaks are possible

看起来像是在编译

看起来空的C ++程序实际上是分配内存并且没有释放它(它不是灾难,因为它" sa"仍然可以到达"泄漏),我不知道为什么会这样。

我使用g ++ 6.3在linux(solus os)上进行了这个测试。

有人能解释一下发生了什么吗?

1 个答案:

答案 0 :(得分:0)

  

这不是灾难,因为它是“仍然可以到达”的泄漏

它甚至不是泄漏。对于没有释放某些全局指向的内存块的程序来说,极其是常见的;执行free

  • 只是让程序退出更慢的不必要的工作
  • 如果多个线程正在运行,
  • 可能会导致并发症(退出线程可能会从另一个线程下面拉出carper)
  • 如果清理的其他部分可以访问此块等,
  • 可能会导致并发症。
  

我不知道为什么会这样。

要获得线索,请运行valgrind --leak-check=full --show-reachable=yes ...。这将告诉你块的分配位置。