簡體   English   中英

此代碼是否會導致內存泄漏?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM