2

我很好奇这段代码是否会导致内存泄漏,这可能是因为我在第 3 行重新分配指针,然后在第 4 行删除它?

谢谢。

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

6 回答 6

8

它不仅泄漏了动态分配的int内容,而且还具有未定义的行为,因为您不能delete使用未分配的对象new(第 5.3.5/2 节)。

的操作数的值可以是空指针值,指向由先前的new-expressiondelete创建的非数组对象的指针,或指向表示此类对象的基类的子对象(1.8)的指针(第 10 条) . 如果不是,则行为未定义。

由于 表示的对象y没有分配new-expression,因此您不能使用delete它来销毁它。它的生命周期由它的作用域控制。

于 2013-05-10T19:36:51.870 回答
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 个字节。

以下是您可以使用 memcheck 执行的操作列表,来自该工具的网站

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

  • 访问您不应该访问的内存,例如溢出和未运行堆块、溢出堆栈顶部以及在内存被释放后访问内存。

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

  • 不正确地释放堆内存,例如双重释放堆块,或 malloc/new/new[] 与 free/delete/delete[] 的不匹配使用

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

    • 内存泄漏。

此类问题可能很难通过其他方式找到,通常会长时间未被发现,然后导致偶尔的、难以诊断的崩溃。

于 2013-05-10T19:40:13.173 回答
2

如果它不首先可能导致崩溃,它将导致内存泄漏。

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

于 2013-05-10T19:36:59.343 回答
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.
于 2013-05-10T19:37:03.470 回答
0

它应该崩溃,因为您将堆栈地址分配给指针,然后将其删除。至少它是不确定的会发生什么。

于 2013-05-10T19:37:14.987 回答
0

是的,它确实会导致内存泄漏,因为随后的分配pt会导致您丢失包含内存的先前分配。如果你在那之前打过电话delete pt就好了。

于 2013-05-10T19:37:21.767 回答