本文深入探討了為什麼簡單地包含
提供的程式碼片段是一個簡單的「hello world」程序,其中包括
透過Valgrind執行此程式並啟用洩漏檢查和追蹤來源會顯示以下輸出:
這表明 72,704 位元組仍然是儘管沒有在程式中明確分配任何內存,但仍可存取。
雖然 Valgrind 的警告可能令人擔憂,但重要的是要了解這是 C 程序的常見行為。 C 標準庫的許多實作都使用自己的記憶體池分配器,這些分配器為被破壞的物件分配記憶體並在以後重複使用它們。這種優化的記憶體管理技術減少了記憶體開銷並提高了效能。
但是,由於 Valgrind 的運行假設是所有分配的記憶體都應在程式終止時返回作業系統,因此它將這些池所持有的記憶體報告為仍然可達。這不一定是程序或 Valgrind 中的錯誤,而是期望的差異。
如果您希望使用 Valgrind 消除仍可達的警告,您可以透過修改編譯器設定來停用STL(標準範本庫)記憶體池。以下是一些方法:
對於 GCC 版本 2.91 到 3.1,您可以使用 -D__USE_MALLOC 編譯程序,強制 STL 使用 malloc 並立即釋放記憶體。不過,這個選項在 GCC 3.3 及更高版本中已被刪除。
對於 GCC 3.2.2 及更高版本,您可以在執行程式之前設定環境變數 GLIBCPP_FORCE_NEW。對於 GCC 3.4 及更高版本,環境變數名稱為 GLIBCXX_FORCE_NEW。
對於較新的編譯器,您可以使用-fno-optimize-sibling-calls 標誌來停用同級呼叫最佳化,其中包含STL記憶體池
包括
以上是為什麼在 C 中包含 `` 會導致 Valgrind 的「Still Rereachable」警告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!