[英]Does this code cause memory leak?
我很好奇,如果這段代碼導致內存泄漏可能是由於我在第4行刪除它之前將指針重新分配給第3行?
謝謝。
1. int y = 12;
2. int *pt = new int;
3. pt = &y;
4. delete pt;
它不僅泄漏動態分配的int
而且還具有未定義的行為,因為您無法delete
未使用new
分配的對象(§5.3.5/ 2)。
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
,那就沒問題了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.