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

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

Mary-Kate Olsen
풀어 주다: 2024-11-29 02:30:13
원래의
910명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿