귀하가 제공한 간단한 프로그램(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)
아직 도달 가능한 경고에 대해 걱정할 필요는 없지만, 해당 라이브러리의 개체가 프로그램에 할당되지 않은 경우 표준 라이브러리 헤더를 포함하면 여전히 도달 가능한 경고가 발생할 수 있는 방법에 대해 질문했습니다.
답은 C 표준 라이브러리가 운영 체제에서 메모리를 할당한 다음 해당 메모리 자체를 관리하는 자체 메모리 관리 시스템을 사용한다는 것입니다. 표준 라이브러리 헤더를 포함하면 기본적으로 이 메모리 관리 시스템이 포함된 표준 라이브러리 코드에 프로그램을 연결하게 됩니다. 결과적으로 표준 라이브러리 코드에서 할당한 메모리는 표준 라이브러리에서 직접 개체를 명시적으로 할당하지 않더라도 프로그램에서 계속 접근할 수 있습니다.
아직 도달 가능한 경고를 수정하는 방법에는 두 가지가 있습니다.
아직 도달 가능 경고를 무시하세요. 메모리 누수에 대해 걱정하지 않으면 여전히 도달 가능한 경고를 무시할 수 있습니다. 이렇게 하려면 Valgrind를 실행할 때 --leak-check=no 플래그를 설정할 수 있습니다.
valgrind --leak-check=no ./ValgrindTest
아직 연결 가능하다는 점을 기억하는 것이 중요합니다. 경고가 반드시 메모리 누수를 나타내는 것은 아닙니다. 이 경우 여전히 도달 가능 경고는 표준 라이브러리의 메모리 관리 시스템으로 인해 발생하며, 메모리 누수를 걱정하지 않는다면 무시해도 됩니다.
위 내용은 간단한 C hello-world 프로그램이 Valgrind와 함께 실행될 때 메모리를 할당하지 않았음에도 불구하고 \'아직 도달 가능\' 메모리 경고를 표시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!