how to delete char* variable
글쓴이: dltkddyd / 작성시간: 금, 2012/05/04 - 4:21오후
delete로 동적할당된 문자열 메모리를 삭제할 때, 중간에 널문자가 있는 경우는 널문자까지만 메모리가 깨지는 것으로 보입니다. 뒤에 있는 메모리는 계속 replace라는 포인터로 참조가 가능합니다. 그렇다면 아래의 소스코드는 메모리 누수가 일어난다고 할 수 있을까요?
#include<iostream>
using namespace std;
int main() {
char* mystr=new char[20];
mystr[0]='t';
mystr[1]='a';
mystr[2]='r';
mystr[3]='g';
mystr[4]='e';
mystr[5]='t';
mystr[6]=0;
mystr[7]='b';
mystr[8]='e';
mystr[9]='s';
mystr[10]='i';
mystr[11]='d';
mystr[12]='e';
mystr[13]=0;
delete[] mystr;
char* replace=&mystr[7];
cout<<replace<<endl;
return 0;
}
Forums:
.
char *replace = &mystr[3];
으로 해도 똑같지 않을까요?
delete[] p를 한다 해서 p 구역의 메모리 값들이 바로 초기화 되지는 않습니다.
다만 후에 프로그램의 다른 곳에서
char *newpointer = new char[123];
와 같은 문장이 실행될 때, p의 메모리 지역을 newpointer가 덮어쓸 수 있습니다.
그런 경우엔 newpointer가 바뀌면 p가 가르키는 값도 바뀌는 이상한 상황이 되는 것입니다.
덤으로
C++에선 어떻게 되는지 모르겠지만..
char *p = (char *)malloc(10);
와 같이 malloc으로 메모리를 할당하게 되면, malloc 내부에서는 실제로 10 + a만큼의 메모리를 할당하게 됩니다.(alignment 이외에도) 그 중에 10byte만큼은 pointer p로 넘겨주고, 나머지 a byte에는 free(p)나 realloc(p)에서 쓰이게 될 '할당된 블록의 크기'라던지 '다음 블록, 이전 블록' 등의 데이터가 들어가게 됩니다.
메모리 누수는 아니고 해제된 영역을 replace 가 가리키고 있는 것일 겁니다.
메모리 누수는 아니고 해제된 영역을 replace 가 가리키고 있는 것일 겁니다.
위의 코드는 mystr이 가리키고 있던 heap 영역이 memory상 해제가 된 상태입니다.
때문에 leak은 아닙니다.
다만,replace 에 항상 'b'가 들어올 것라는 보장은 못합니다.
mystr이 언제 다른 곳에서 사용되어 'b'가 write되어있는 영역이 지워지거다 바뀔지 추적은 힘들 것입니다.
thank you for your kind answer.
I have been given a good answer. Your answer is helpful to me. You raise my pleasure up. Thank you.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
댓글 달기