此代码是否会导致内存泄漏?

时间:2013-05-10 19:35:36

标签: c++ memory-leaks

我很好奇这段代码是否会导致内存 泄漏可能是由于我重新分配的事实 第3行的指针在第4行删除之前?

感谢。

1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt; 

6 个答案:

答案 0 :(得分:8)

它不仅泄漏了动态分配的int,而且还有未定义的行为,因为你不能delete一个没有用new分配的对象(§5.3.5/ 2)。

  

delete的操作数的值可以是空指针值,指向由前一个 new-expression 创建的非数组对象的指针,或指向子对象的指针(1.8)代表这种对象的基类(第10条)。如果不是,则行为未定义。

由于y表示的对象未分配 new-expression ,因此您无法使用delete来销毁它。它的寿命取决于其范围。

答案 1 :(得分:4)

每当您不确定代码中的内存泄漏时,可以使用valgrind valgrind --tool=memcheck来检查它们,但请确保在没有任何优化的情况下编译代码并处于完全调试模式(例如“g ++ -g”)。

以下是您的计划的输出:

=29667== Memcheck, a memory error detector
==29667== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==29667== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==29667== Command: ./main
==29667== 
==29667== Invalid free() / delete / delete[]
==29667==    at 0x4C26DCF: operator delete(void*) (vg_replace_malloc.c:387)
==29667==    by 0x4006AB: main (main.cpp:7)
==29667==  Address 0x7fefffd0c is on thread 1's stack
==29667== 
==29667== 
==29667== HEAP SUMMARY:
==29667==     in use at exit: 4 bytes in 1 blocks
==29667==   total heap usage: 1 allocs, 1 frees, 4 bytes allocated
==29667== 
==29667== LEAK SUMMARY:
==29667==    definitely lost: 4 bytes in 1 blocks
==29667==    indirectly lost: 0 bytes in 0 blocks
==29667==      possibly lost: 0 bytes in 0 blocks
==29667==    still reachable: 0 bytes in 0 blocks
==29667==         suppressed: 0 bytes in 0 blocks
==29667== Rerun with --leak-check=full to see details of leaked memory
==29667== 
==29667== For counts of detected and suppressed errors, rerun with: -v
==29667== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)

您的代码在exit()处丢失了4个字节。

以下是您可以使用工具的website

对memcheck执行的操作列表
  

Memcheck是一个内存错误检测器。它可以检测以下内容   C和C ++程序中常见的问题。

     
      
  • 访问内存你不应该,例如超越和   不足的堆块,超越堆栈的顶部,以及访问内存   在它被释放后。

  •   
  • 使用未定义的值,即尚未初始化的值,   或者是从其他未定义的值派生而来的。

  •   
  • 不正确地释放堆内存,例如双重释放堆块,   或不匹配使用malloc / new / new []与   免费/删除/删除[]

         
        
    • 在memcpy及相关函数中重叠src和dst指针。

    •   
    • 内存泄漏。

    •   
  •   
     

通常情况下,通过其他方式很难找到这些问题   长时间未被发现,然后偶尔发生,   难以诊断的崩溃。

答案 2 :(得分:2)

如果不首先导致崩溃,则会导致内存泄漏。

您不应删除具有“自动”存储空间的对象。

答案 3 :(得分:0)

您丢失了指向您泄漏的new int的指针

pt = &y; // Here the memory allocated is not reachable now and can not be deleted 

这是UB

delete pt;  // pt is pointing to automaticaly allocated memory now. You can't delete that.

答案 4 :(得分:0)

它应该崩溃,因为你为指针分配一个堆栈地址然后删除它。至少它未定义会发生什么。

答案 5 :(得分:0)

是的,确实会导致内存泄漏,因为pt的后续分配会导致您丢失包含内存的先前分配。如果你之前曾打过delete pt,那就没关系了。