2016-08-06 2 views
0

누군가이 코드가 힙 손상을 초래하는 이유를 설명 할 수 있습니까?포인터를 삭제하면 힙이 손상됩니다.

string someText = "hello hello"; 
char **arrayOfCharPtr = new char*[5]; 
arrayOfCharPtr[0] = new char[someText.length()]; 
strcpy(arrayOfCharPtr[0], someText.c_str()); 
delete[] arrayOfCharPtr[0]; 

감사합니다.

+1

배열의 길이가 1 문자이므로 'strcpy'에 의해 복사 된 널 문자를위한 공간이 없습니다. – user657267

+0

좋습니다, length() + 1.하지만 왜 메모리 누수가 발생합니까? strcpy 행 자체는 오류를 일으키지 않습니다. 그것을 일으키는 것은 delete-line이다. arrayOfCharPtr [0]에있는 내용의 길이에 관계없이 내용을 삭제할 수없는 이유는 무엇입니까? – Johan

+1

"strcpy 행 자체가 오류를 발생시키지 않습니다."정의되지 않은 동작에 오신 것을 환영합니다. 여기서 일들이 작동하는 것처럼 보일 수 있지만 소스에서 멀리 떨어진 곳에서는 어리석은 방법으로 폭발합니다. – user657267

답변

3

마지막 '\ 0'문자를 저장하기 위해 문자열 길이보다 한 문자를 할당해야합니다.

arrayOfCharPtr[0] = new char[someText.length()+1]; 

strcpy는 할당 된 블록 다음에 마지막 '\ 0'을 쓰고 힙을 손상시킵니다.

같은 도구는 valgrind을 이해하는 데 도움이 될 수 있습니다. valgrind는 오류 소스를 현지화하는

==16970== Invalid write of size 1 
==16970== at 0x4C3106F: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==16970== by 0x400C47: main 
==16970== Address 0x5ab5cfb is 0 bytes after a block of size 11 alloc'd 
==16970== at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==16970== by 0x400C1C: main 

을 생성합니다.

관련 문제