我很好奇这段代码是否会导致内存 泄漏可能是由于我重新分配的事实 第3行的指针在第4行删除之前?
感谢。
1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt;
答案 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
,那就没关系了。