메모리 동적할당 뒤에 delete[] 로 메모리를 파괴했지만 내용은 그대로...

dltkddyd의 이미지

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;
}

shint의 이미지

http://ideone.com/

new에 대한 메모리 해지는 되더라도. 값'은 남아 있어서. 초기화 해줘야하는거 같습니다.

#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;
 
	for(int i=0; i<20; i++)
	{
		printf("-%2d- %c\n", i, mystr[i]);
	}
	return 0;
}
 
- 0- 
- 1- 
- 2- 
- 3- 
- 4- e
- 5- t
- 6- 
- 7- b
- 8- e
- 9- s
-10- i
-11- d
-12- e
-13- 
-14- 
-15- 
-16- 
-17- 
-18- 
-19- 

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

ifree의 이미지

그냥 쓰레기 값이 그 메모리 주소에 남아 있을 뿐이죠.

gurumong의 이미지

어떤 책에서 이런 내용을 본적이 있습니다
디버깅용으로 컴파일할때에는
메모리를 해제하는 함수를 래핑하는 함수를 메모리 해제할때 대신 사용하는데
그 함수에서는 메모리를 해제하기전에 특정 값으로 메모리를 모두 채운 다음에 해제합니다
이후 해제한 메모리에 접근해서 사용할적에, 프로그래머가 (착각하는) 기대하는 값과 다른 값이 있어서
금방 그런 버그를 찾을 수 있다고 하더라구요

gurumong의 이미지

어떤 책에서 이런 내용을 본적이 있습니다
디버깅용으로 컴파일할때에는
메모리를 해제하는 함수를 래핑하는 함수를 메모리 해제할때 대신 사용하는데
그 함수에서는 메모리를 해제하기전에 특정 값으로 메모리를 모두 채운 다음에 해제합니다
이후 해제한 메모리에 접근해서 사용할적에, 프로그래머가 (착각하는) 기대하는 값과 다른 값이 있어서
금방 그런 버그를 찾을 수 있다고 하더라구요

jick의 이미지

C(++) 표준상 헤재된 메모리를 다시 건드리는 것은 정의되지 않은 행동입니다. (...아마 맞을 겁니다. 제가 표준에 빠삭하지 않아서 확신은 못하지만... -_-)

"정의되지 않은 행동"이란 말은 "무슨 일이 일어나도 이상하지 않다"라는 뜻입니다.

따라서 그 순간 프로세스가 죽을 수도 있고, 예전에 있던 값을 그냥 읽을 수도 있습니다. 어느 쪽이든 정상입니다.

(흠, 다시 생각해 보니, 프로그램이 잘못된 동작을 하려고 하는 거니 "정상"이라고 하는 건 좀 이상하군요.)

declspec의 이미지

처음 4바이트가 비어있는데 이유는
new 의 동적 메모리 할당/해제 알고리즘에서
4바이트에 어떤값이 덮어써졌기 때문일까요?

glibc malloc 구현에서는 할당된 동적메모리가
링크드 리스트 형태로 관리되고 해지될때 리스트삭제연산이 일어나는데
그 과정중에 forward pointer, backward pointer 가 각각
4바이트씩 8바이트를 차지해서 동적메모리 payload 에
쓰여집니다

new 에서는 혹시 어떻게 되는지 아시는분 계신가요?

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

dltkddyd의 이미지

In my keyboard, I can't type hangul. So i say to you in english "Thak you!"

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.