메모리 동적할당 뒤에 delete[] 로 메모리를 파괴했지만 내용은 그대로...
mystr이라는 문자형 포인터에 아래와 같이 문자열을 저장했습니다. mystr[6]과 mystr[13]에 널문자를 저장하고,
뒤에서 delete[] mystr;
했을 때, mystr의 각 요소 20개가 모두 깨지는지를 알아보기 위해 다시 replace라는 문자열 포인터로 mystr[7]의 주소를 받아왔습니다. 그랬더니 여전히 mystr[7] 이후의 공간에는 "beside"라는 것이 남아있습니다. 그렇다면 지워진 대상체는 mystr[0]~mystr[6] 이라고 추정할 수 있습니다. 그렇다면 mystr[7]~mystr[19] 까지의 메모리는 깨지지 않은 상태로 남아 누수된다는 말이 되나요? 널문자가 중간에 삽입되면 그 포인터를 깨트려도 전체가 깨지는 것이 아니라 널문자까지만 깨지게 되는 것인가요? 소스코드는 아래와 같습니다.
#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;
}
여기서는 이렇네요.
http://ideone.com/
new에 대한 메모리 해지는 되더라도. 값'은 남아 있어서. 초기화 해줘야하는거 같습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
그냥 쓰레기 값이 그 메모리 주소에 남아 있을
그냥 쓰레기 값이 그 메모리 주소에 남아 있을 뿐이죠.
어떤 책에서 이런 내용을 본적이 있습니다 디버깅용으로
어떤 책에서 이런 내용을 본적이 있습니다
디버깅용으로 컴파일할때에는
메모리를 해제하는 함수를 래핑하는 함수를 메모리 해제할때 대신 사용하는데
그 함수에서는 메모리를 해제하기전에 특정 값으로 메모리를 모두 채운 다음에 해제합니다
이후 해제한 메모리에 접근해서 사용할적에, 프로그래머가 (착각하는) 기대하는 값과 다른 값이 있어서
금방 그런 버그를 찾을 수 있다고 하더라구요
어떤 책에서 이런 내용을 본적이 있습니다 디버깅용으로
어떤 책에서 이런 내용을 본적이 있습니다
디버깅용으로 컴파일할때에는
메모리를 해제하는 함수를 래핑하는 함수를 메모리 해제할때 대신 사용하는데
그 함수에서는 메모리를 해제하기전에 특정 값으로 메모리를 모두 채운 다음에 해제합니다
이후 해제한 메모리에 접근해서 사용할적에, 프로그래머가 (착각하는) 기대하는 값과 다른 값이 있어서
금방 그런 버그를 찾을 수 있다고 하더라구요
해제된 메모리에는 뭐든지 있을 수 있습니다
C(++) 표준상 헤재된 메모리를 다시 건드리는 것은 정의되지 않은 행동입니다. (...아마 맞을 겁니다. 제가 표준에 빠삭하지 않아서 확신은 못하지만... -_-)
"정의되지 않은 행동"이란 말은 "무슨 일이 일어나도 이상하지 않다"라는 뜻입니다.
따라서 그 순간 프로세스가 죽을 수도 있고, 예전에 있던 값을 그냥 읽을 수도 있습니다. 어느 쪽이든 정상입니다.
(흠, 다시 생각해 보니, 프로그램이 잘못된 동작을 하려고 하는 거니 "정상"이라고 하는 건 좀 이상하군요.)
처음 4바이트
처음 4바이트가 비어있는데 이유는
new 의 동적 메모리 할당/해제 알고리즘에서
4바이트에 어떤값이 덮어써졌기 때문일까요?
glibc malloc 구현에서는 할당된 동적메모리가
링크드 리스트 형태로 관리되고 해지될때 리스트삭제연산이 일어나는데
그 과정중에 forward pointer, backward pointer 가 각각
4바이트씩 8바이트를 차지해서 동적메모리 payload 에
쓰여집니다
new 에서는 혹시 어떻게 되는지 아시는분 계신가요?
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
thank you for your kind answer.
In my keyboard, I can't type hangul. So i say to you in english "Thak you!"
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
댓글 달기