how to delete char* variable

dltkddyd의 이미지

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;

}

나그네나그네의 이미지

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)에서 쓰이게 될 '할당된 블록의 크기'라던지 '다음 블록, 이전 블록' 등의 데이터가 들어가게 됩니다.

karzia의 이미지

메모리 누수는 아니고 해제된 영역을 replace 가 가리키고 있는 것일 겁니다.

위의 코드는 mystr이 가리키고 있던 heap 영역이 memory상 해제가 된 상태입니다.

때문에 leak은 아닙니다.

다만,replace 에 항상 'b'가 들어올 것라는 보장은 못합니다.

mystr이 언제 다른 곳에서 사용되어 'b'가 write되어있는 영역이 지워지거다 바뀔지 추적은 힘들 것입니다.

dltkddyd의 이미지

I have been given a good answer. Your answer is helpful to me. You raise my pleasure up. Thank 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.