我很好奇这段代码是否会导致内存泄漏,这可能是因为我在第 3 行重新分配指针,然后在第 4 行删除它?
谢谢。
1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt;
我很好奇这段代码是否会导致内存泄漏,这可能是因为我在第 3 行重新分配指针,然后在第 4 行删除它?
谢谢。
1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt;
它不仅泄漏了动态分配的int
内容,而且还具有未定义的行为,因为您不能delete
使用未分配的对象new
(第 5.3.5/2 节)。
的操作数的值可以是空指针值,指向由先前的new-expression
delete
创建的非数组对象的指针,或指向表示此类对象的基类的子对象(1.8)的指针(第 10 条) . 如果不是,则行为未定义。
由于 表示的对象y
没有分配new-expression,因此您不能使用delete
它来销毁它。它的生命周期由它的作用域控制。
每当您不确定代码中的内存泄漏时,您可以使用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 指针。
内存泄漏。
此类问题可能很难通过其他方式找到,通常会长时间未被发现,然后导致偶尔的、难以诊断的崩溃。
如果它不首先可能导致崩溃,它将导致内存泄漏。
您不应该删除具有“自动”存储的对象。
是的。
当你失去指向你的指针的那一刻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.
它应该崩溃,因为您将堆栈地址分配给指针,然后将其删除。至少它是不确定的会发生什么。
是的,它确实会导致内存泄漏,因为随后的分配pt
会导致您丢失包含内存的先前分配。如果你在那之前打过电话delete pt
就好了。