0

문자 배열/c 문자열을 사용하는 프로그램을 작성하고 있습니다. 나는이 프로그램을 실행할 때마다, Valgrind의이 '확실히 손실'블록 경고 발생 :이 생성자와 소멸자의 소스 코드입니다새 문자 배열 (C 문자열) 할당시 메모리 누수

==8011== [X] bytes in [Y] blocks are definitely lost in loss record 1 of [Z] 
==8011== at 0x4A065BA: operator new[](unsigned long) (vg_replace_malloc.c:264) 
==8011== by 0x403D45: File::File(stat*, char const*) (File.cpp:15) 
... 

을 (헤더 ID, ISDIR,과 lastModified에 대한 정의 및 이름 (이름이 포함 const char *) 유형) :

10 File::File(struct stat *statdat, const char* strName) 
11 { 
12 id = statdat->st_ino; 
13 isDir = S_ISDIR(statdat->st_mode); 
14 lastModified = (statdat->st_mtime); 
15 char* tempName = new char[strlen(strName)+1]; 
16 strcpy(tempName, strName); 
17 name = tempName; 
18 tempName = NULL; 
19 } 
20 
21 File::~File() 
22 { 
23 //delete [] name; 
24 } 

여기에 몇 가지 질문이 있습니다.

a) 컴파일러가 실행될 때 소멸자에서 삭제하려고하면 잘못된 포인터로 인해 즉시 충돌이 발생합니다. 문자 배열에서 delete를 호출 할 수없는 이유는 무엇입니까?

b) 배열에 대해 적절한 양의 메모리를 할당하고 있다고 생각합니다. 새로운 공간을 할당 할 때 메모리 누수의 원인은 무엇입니까? 오류는 프로그램이 중단 된 후 발생합니다 (valgrind의 HEAP SUMMERY 이후).

+0

소멸자의'delete [] name;'이 그것을 처리해야합니다. 또한 std :: string을 사용 해본 적이 있습니까? 관리하기가 더 쉬울 것입니다. 또한 tempName 변수를 사용하지 않아도됩니다. 난 그냥 this-> name char *를 사용할 것이다. (그냥 스타일 노트, 정확성과 관련 없음) – Corbin

+0

@ 코빈,이 작동하지 않습니다. 첫째, const char *에 strcpy를 사용할 수 없기 때문에 해결 방법으로 tempName을 사용하고 있습니다. 둘째, 삭제 주석을 제거하면 valgrind가 초기화되지 않은 값 및 유효하지 않은 free/delete/delete []에 대한 불만을 야기합니다. – Tanaki

+0

strcpy의 두 번째 인수는'const char *'입니다. 또한, 당신이 게시 한 코드는'new'가 오류가 없다고 가정하고 소멸자의 delete []가 올바른 것입니다 (이미 다른 곳에서 해제하지 않았다면). 전체 클래스 정의를 게시 할 수 있습니까? – Corbin

답변

1

문제점을 확인했습니다.

내 문제는/default/생성자에서 발생했습니다. 'name'을 초기화하지 않았으므로 delete 키워드는 기본 생성자가 만든 객체에서 소멸자가 호출 될 때 null 포인터를 삭제하려고했습니다. 이름을 '\ 0'으로 초기화하기 위해 File의 기본 생성자를 수정하여 문제를 해결 한 것으로 보입니다.