2009-12-22 5 views
2

new[]에 의해 할당 된 char*에 문자열을 읽기 위해 HDF5를 사용하고 있습니다. 다음 문자열을 사용하여 :: assign() 호출이 데이터를 실제로 원하는 위치로 복사 할 수 있습니다. 그런 다음 해당 char *에 delete[]을 호출합니다. 이것은 totalview를 사용하여 메모리 누수의 소스로 표시됩니다. stdlibC++에서 변경된 호출을 delete[]에서,, create, malloc까지 표시합니다. 무슨 일이 벌어지고 있고, 이것은 정말 메모리 누수입니까? 나는 GLIBCXX_FORCE_NEW=1도 여기에 놓았다.Malloc call on delete [] totalview에서 메모리 누출으로 나타납니다

다음은 상황을 복제하는 코드 예입니다. valgrind에는 누수가 표시되지 않으며, cout 호출 전에 중단 점을 두지 않으면 totalview에서 누수가 발견되지 않습니다.
하지만 표준 : : 벡터가 아닌 newing 문자의 배열을 사용하는 것이 좋습니다 것입니다 :

#include <string> 
#include <iostream> 
#include <cstdlib> 

int main() 
{ 
    std::string str; 

    int len = strlen(getenv("PATH")); 
    char* x = new char[len + 1]; 
    strcpy(x, getenv("PATH")); 
    x[len] = '\0'; 

    str.assign(x); 

    delete[] x; 

    std::cout << str << std::endl; 
} 
+0

strcpy 이상 선호하지 않습니다. "총 힙 사용 : 2 할당, 2 해제, 할당 된 146 바이트" –

+0

윌, 그 OP 자신을 말하지 않았습니까? –

+1

'str = getenv ("PATH")'할 수 없습니까? – UncleBens

답변

3

괜찮을한다

std::vector<char> x(len+1); 
strcpy(&x[0], getenv("PATH")); 

내가 이런 짓을 했을까 이유는 그런 방법 어사 ()는 잠재적으로 예외를 throw 할 수 있습니다. 따라서 삭제가 호출되지 않을 수 있으므로 예외가있는 경우 누출 될 수 있습니다. RAII 때문에 벡터를 사용하면 메모리가 정리됩니다.

+0

+1. RAII 언급 때문에. – paercebal

+0

OP가'unsigned char * '대신'char *'를 사용하기 때문에 std :: vector 대신 std :: string을 사용할 것을 제안합니다. –

+0

흠 ... 네가하는 말은 완전히 유효하지만 질문에 대답하려고 시도하는 것인가? –

2

는 누출과 관련,하지만 당신은 길이를 알고있는 경우 Valgrind의를 통해이 프로그램을 실행하면 아무런 경고를 생성하지 strncpy

+0

'strcpy'는 널 문자를 찾거나, 잘못된 주소에 도달하거나, 세상이 끝날 때까지 모든 문자를 복사합니다. –

+0

'std :: string'의 유용한 기능은 복사 기능이 내장되어 * 테스트 됨 *입니다. –

관련 문제