首頁 > 後端開發 > C++ > 為什麼在 C 中包含 `` 會導致 Valgrind 的「Still Rereachable」警告?

為什麼在 C 中包含 `` 會導致 Valgrind 的「Still Rereachable」警告?

Linda Hamilton
發布: 2024-12-03 18:35:13
原創
684 人瀏覽過

Why Does Including `` in C   Cause Valgrind's

在C 中包含標準庫頭檔和Valgrind 警告

簡介:

本文深入探討了為什麼簡單地包含 的問題; C 程式中的標準函式庫頭可以在Valgrind 中觸發仍然可達的警告,即使該庫中的任何物件都沒有在程式中指派。

程式和Valgrind 輸出:

提供的程式碼片段是一個簡單的「hello world」程序,其中包括標頭但不執行任何分配:

透過Valgrind執行此程式並啟用洩漏檢查和追蹤來源會顯示以下輸出:

這表明 72,704 位元組仍然是儘管沒有在程式中明確分配任何內存,但仍可存取。

Valgrind 的行為:

雖然 Valgrind 的警告可能令人擔憂,但重要的是要了解這是 C 程序的常見行為。 C 標準庫的許多實作都使用自己的記憶體池分配器,這些分配器為被破壞的物件分配記憶體並在以後重複使用它們。這種優化的記憶體管理技術減少了記憶體開銷並提高了效能。

但是,由於 Valgrind 的運行假設是所有分配的記憶體都應在程式終止時返回作業系統,因此它將這些池所持有的記憶體報告為仍然可達。這不一定是程序或 Valgrind 中的錯誤,而是期望的差異。

停用 C 函式庫最佳化:

如果您希望使用 Valgrind 消除仍可達的警告,您可以透過修改編譯器設定來停用STL(標準範本庫)記憶體池。以下是一些方法:

使用 __USE_MALLOC:

對於 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 中觸發仍然可達的警告。此行為是預期行為,而不是錯誤。停用 STL 優化可以消除這些警告,但這可能會以效能下降為代價。

以上是為什麼在 C 中包含 `` 會導致 Valgrind 的「Still Rereachable」警告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板