>백엔드 개발 >C++ >간단한 C hello-world 프로그램이 Valgrind와 함께 실행될 때 메모리를 할당하지 않았음에도 불구하고 \'아직 도달 가능\' 메모리 경고를 표시하는 이유는 무엇입니까?

간단한 C hello-world 프로그램이 Valgrind와 함께 실행될 때 메모리를 할당하지 않았음에도 불구하고 \'아직 도달 가능\' 메모리 경고를 표시하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-29 02:30:131042검색

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)

아직 도달 가능한 경고의 원인

아직 도달 가능한 경고에 대해 걱정할 필요는 없지만, 해당 라이브러리의 개체가 프로그램에 할당되지 않은 경우 표준 라이브러리 헤더를 포함하면 여전히 도달 가능한 경고가 발생할 수 있는 방법에 대해 질문했습니다.

답은 C 표준 라이브러리가 운영 체제에서 메모리를 할당한 다음 해당 메모리 자체를 관리하는 자체 메모리 관리 시스템을 사용한다는 것입니다. 표준 라이브러리 헤더를 포함하면 기본적으로 이 메모리 관리 시스템이 포함된 표준 라이브러리 코드에 프로그램을 연결하게 됩니다. 결과적으로 표준 라이브러리 코드에서 할당한 메모리는 표준 라이브러리에서 직접 개체를 명시적으로 할당하지 않더라도 프로그램에서 계속 접근할 수 있습니다.

아직 접근 가능 경고를 수정하는 방법

아직 도달 가능한 경고를 수정하는 방법에는 두 가지가 있습니다.

  1. 다른 메모리 관리를 사용하도록 컴파일러를 구성하세요. system. 이는 프로그램을 컴파일할 때 -D_GLIBCXX_FORCE_NEW=1 플래그를 설정하여 수행할 수 있습니다. 이 플래그는 표준 라이브러리의 메모리 관리 시스템 대신 malloc() 및 free() 함수를 사용하도록 컴파일러에 지시합니다.
  2. 아직 도달 가능 경고를 무시하세요. 메모리 누수에 대해 걱정하지 않으면 여전히 도달 가능한 경고를 무시할 수 있습니다. 이렇게 하려면 Valgrind를 실행할 때 --leak-check=no 플래그를 설정할 수 있습니다.

    valgrind --leak-check=no ./ValgrindTest

결론

아직 연결 가능하다는 점을 기억하는 것이 중요합니다. 경고가 반드시 메모리 누수를 나타내는 것은 아닙니다. 이 경우 여전히 도달 가능 경고는 표준 라이브러리의 메모리 관리 시스템으로 인해 발생하며, 메모리 누수를 걱정하지 않는다면 무시해도 됩니다.

위 내용은 간단한 C hello-world 프로그램이 Valgrind와 함께 실행될 때 메모리를 할당하지 않았음에도 불구하고 \'아직 도달 가능\' 메모리 경고를 표시하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.