您提供的簡單程式(名為 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)
你並不在乎是否需要擔心stillreachable警告,但是你確實詢問了當程式中沒有分配該庫中的物件時,簡單地包含標準庫頭會如何導致仍然可達的警告
答案是C 標準庫使用自己的記憶體管理系統,該系統從作業系統分配內存,然後自行管理該內存。 當您包含標準庫標頭時,本質上是將您的程式連結到標準庫程式碼,其中包括此記憶體管理系統。 因此,即使您自己沒有明確地從標準庫分配任何對象,標準庫程式碼分配的記憶體仍然可以從您的程式存取。
有兩種方法可以修復仍然可達的警告:
忽略 stillreachable 警告。 如果您不關心記憶體洩漏,您可以簡單地忽略仍可達的警告。 為此,您可以在運行Valgrind 時設定--leak-check=no 標誌:
valgrind --leak-check=no ./ValgrindTest
重要的是要記住仍然可達警告不一定表示記憶體洩漏。 在這種情況下,仍然可達的警告是由標準庫的記憶體管理系統引起的,如果您不擔心記憶體洩漏,可以安全地忽略它。
以上是為什麼一個簡單的 C hello-world 程式在使用 Valgrind 運行時會顯示「仍然可達」記憶體警告,儘管沒有分配任何記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!