2010-06-08 2 views
10

표준 : : 문자열과 Valgrind의 문제 :C++의 std :: string 풀, 디버그 빌드? 이와 같은 내가 표준 : : 문자열에서 가능한 메모리 누수에 대해 많은 Valgrind의 경고에 문제가

120 bytes in 4 blocks are possibly lost in loss record 4,192 of 4,687 
    at 0x4A06819: operator new(unsigned long) (vg_replace_malloc.c:230) 
    by 0x383B89B8B0: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.8) 
    by 0x383B89C3B4: (within /usr/lib64/libstdc++.so.6.0.8) 
    by 0x383B89C4A9: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.8) 

궁금 해요 :

  • 가하는 std :: string (GCC 4.1.2)는 메모리 풀을 사용합니까?
  • 그렇다면 디버그 빌드 등의 형태로 풀을 비활성화하는 방법이 있습니까?

답변

1

120 바이트로 풀이 충분하지 않습니다. Do you exit() from your program?

+0

아니요, exit()가 없습니다. 수영장이 없으면 왜 메모리가 손실 될 수 있습니까? –

6

FAQ을 확인하십시오. 컨테이너에 "메모리 누수"섹션이 있습니다. 당신은

  • 은 프로그램의 디버그 빌드를 사용
  • Valgrind의
  • 의 버전을 확인해야합니다 (그리고 유엔 최적화)
  • 하고 필요한 경우 GLIBCXX_FORCE_NEW을 정의합니다. (이 프로그램의 런타임 동작, 예상대로되지 컴파일시 #define에 영향을 미치는 환경 변수입니다.)
2

내가 정확히 기억한다면, 많은 STL의 할당 자 메모리 유지의 어떤 종류를 구현합니다. IE는 즉시 할당 된 메모리를 해제하지 않지만 계속 유지하고 재사용합니다. 내 STL 구현에서 할당 한 메모리에서 오는 valgrind에서 오탐 (false positives)이 많이 발생했습니다.

문제를 해결하는 가장 좋은 방법은 (단순히) 억제 파일을 사용하는 것입니다.

0

방금 ​​라이브러리의 개발 버전과 연결했기 때문에이 문제가 발생했습니다. 그러나 테스트 코드는 이전 버전의 시스템에 설치된 버전을 사용하고있었습니다. 변경 사항은 명백한 문제없이 연결되어 실행될 수있을 정도로 미묘하지만, Valgrind는 이상한 누출을 감지합니다. valgrind 대신 ldd을 사용하면 잘못된 라이브러리 파일을 가져 오는 것으로 확인되었습니다. LD_LIBRARY_PATH을 올바르게 설정하면 올바른 해결책은 라이브러리 버전을 증가시키는 것입니다. 분명히 이전 버전과 호환되지 않기 때문입니다.

virtual 함수에 virtual 소멸자가없는 클래스와 같이 개체가 제대로 파괴되지 않은 경우에도이 문제가 발생했습니다. 클래스를 포인터 기반 클래스에 넣은 다음 파기하면 기본 클래스 소멸자 만 실행되고 예에서 std::string 인스턴스와 같이 파생 클래스에 할당 된 모든 것이 누출됩니다. 여기서 힌트는 누출 된 string을 사용하는 클래스를 확인하고 클래스 계층 구조를 따라 기본 클래스로 돌아가 명시적인 virtual 소멸자 (비어있는 경우에도)가 있는지 확인하는 것입니다. 클래스에 virtual 함수가 있지만 분명히 그렇지 않을 경우 암시 적이라고 가정하고있었습니다. GCC는 이에 대해 경고하지 않습니다.

0

잡히지 않은 예외로 인해 프로그램이 종료 되었기 때문에이 문제가 발생했습니다. 분명히 잡히지 않은 예외 처리기가 모든 것을 정리하지는 않습니다.

관련 문제