首頁 > 後端開發 > C++ > 為什麼一個簡單的 C hello-world 程式在使用 Valgrind 運行時會顯示「仍然可達」記憶體警告,儘管沒有分配任何記憶體?

為什麼一個簡單的 C hello-world 程式在使用 Valgrind 運行時會顯示「仍然可達」記憶體警告,儘管沒有分配任何記憶體?

Mary-Kate Olsen
發布: 2024-11-29 02:30:13
原創
991 人瀏覽過

Why does a simple C   hello-world program, when run with Valgrind, show a

簡單的程式和輸出

您提供的簡單程式(名為 ValgrindTest)是一個用 C 編寫的簡單的 hello-world 程式。

#include <iostream>
int main() {
  return 0;
}
登入後複製

當使用Valgrind(版本3.10.1)運行該程式時,它報告有1 個區塊中有72,704 個位元組仍然可達:

$ valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./ValgrindTest
==27671== Memcheck, a memory error detector
==27671== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==27671== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==27671== Command: ./ValgrindTest
==27671== 
==27671== 
==27671== HEAP SUMMARY:
==27671==     in use at exit: 72,704 bytes in 1 blocks
==27671==   total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==27671== 
==27671== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==27671==    at 0x4C2AB9D: malloc (vg_replace_malloc.c:296)
==27671==    by 0x4EC060F: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==27671==    by 0x400F305: call_init.part.0 (dl-init.c:85)
==27671==    by 0x400F3DE: call_init (dl-init.c:52)
==27671==    by 0x400F3DE: _dl_init (dl-init.c:134)
==27671==    by 0x40016E9: ??? (in /lib/x86_64-linux-gnu/ld-2.15.so)
==27671== 
==27671== LEAK SUMMARY:
==27671==    definitely lost: 0 bytes in 0 blocks
==27671==    indirectly lost: 0 bytes in 0 blocks
==27671==      possibly lost: 0 bytes in 0 blocks
==27671==    still reachable: 72,704 bytes in 1 blocks
==27671==         suppressed: 0 bytes in 0 blocks
==27671== 
==27671== For counts of detected and suppressed errors, rerun with: -v
==27671== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
登入後複製

Still Reachable警告的原因

你並不在乎是否需要擔心stillreachable警告,但是你確實詢問了當程式中沒有分配該庫中的物件時,簡單地包含標準庫頭會如何導致仍然可達的警告

答案是C 標準庫使用自己的記憶體管理系統,該系統從作業系統分配內存,然後自行管理該內存。 當您包含標準庫標頭時,本質上是將您的程式連結到標準庫程式碼,其中包括此記憶體管理系統。 因此,即使您自己沒有明確地從標準庫分配任何對象,標準庫程式碼分配的記憶體仍然可以從您的程式存取。

如何修復仍然可訪問的警告

有兩種方法可以修復仍然可達的警告:

  1. 配置編譯器以使用不同的記憶體管理system. 這可以透過在編譯程式時設定-D_GLIBCXX_FORCE_NEW=1 標誌來完成。 此標誌告訴編譯器使用 malloc() 和 free() 函數,而不是標準函式庫的記憶體管理系統。
  2. 忽略 stillreachable 警告。 如果您不關心記憶體洩漏,您可以簡單地忽略仍可達的警告。 為此,您可以在運行Valgrind 時設定--leak-check=no 標誌:

    valgrind --leak-check=no ./ValgrindTest
    登入後複製

結論

重要的是要記住仍然可達警告不一定表示記憶體洩漏。 在這種情況下,仍然可達的警告是由標準庫的記憶體管理系統引起的,如果您不擔心記憶體洩漏,可以安全地忽略它。

以上是為什麼一個簡單的 C hello-world 程式在使用 Valgrind 運行時會顯示「仍然可達」記憶體警告,儘管沒有分配任何記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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