[완료] C++ 메모리 동적 할당 및 해제에 대해서 확실히 해두고 싶습니다 ~ 도와주세요 ~

cjynim의 이미지

cout<<"\n\nnew 연산자를 통한 정수 2차원 배열 동적 할당 .."<<endl;
int** arr2;
arr2 = new int*[BUF];
for(int i=0; i<BUF; i++) 
	arr2[i] = new int[BUF];
count=0;
for(int i=0; i<BUF; i++)
	for(int j=0; j<BUF; j++)
		arr2[i][j] = count++;
for(int i=0; i<BUF; i++)
	for(int j=0; j<BUF; j++)
		cout<<"arr2["<<i<<"]["<<j<<"] = "<<arr2[i][j]<<endl;
for(int i=0; i<BUF; i++)
	delete[] arr2[i];
delete[] arr2;

이 소스는 제가 C++의 new, delete연산자를 공부하다가 만들어 본 예제 소스인데요 일단 메모리 할당

과 해제가 옳바르게 이루어 지고 있는지 궁금합니다. 그리고 delete[]를 delete로 바꾸어 주어도 이

상없이 잘 해제는 되는것 같습니다(visual studio 2005를 사용하는데 일단 오류 메시지 없이 실행을

잘 되더라구요 ...)그런데 delete와 delete[]의 차이점이 궁금해서 인터넷에 찾아보니 인용하자면

====================================================================================
우선 delete 와 delete[]의 차이를 한마디로 말하라면
delete 는 단일 객체에 대한 소멸자의 호출과 메모리 환원을 하며
delete[] 는 배열객체에 대한 각각의 소멸자의 호출과 메모리 환원을 한다는 것입니다.

그러므로
ClassA *pp = new ClassA;
delete pp;
는 아무런 문제가 없으나
ClassA *pp = new ClassA[10];
delete pp;
과 같이 하는 경우는 pp[0]에 대한 소멸자와 메모리 해제만 이루어 집니다.
반드시
ClassA *pp = new ClassA[10];
delete[] pp;
와 같이 해야 합니다. 그렇지 않으면 메모리 누수가 발생합니다.

혹자는 그냥 delete 만 써도 아무런 문제가 없다라고 말합니다.
이는 프로그램 종료시 할당받았던 전체 메모리가 OS에 의해 해제되기 때문입니다.
즉 메모리에 민감한 프로그램이 아닌 경우이겠지만, 정밀한 프로그램에서는 반드시 짝을 맞춰야 합니다.
======================================================================================

이런 내용이 있었는데요 .. 그럼 위에 제가 만든 소스가 옳바른 방법으로 메모리를 해제 한것이 맞나요??

C++을 처음 공부하다 보니까 이것저것 정신이 없습니다 ... 그럼 지금까지 읽어주셔서 고맙습니다 ..

오늘 하루도 즐프, 열공 하세요 ~

klara의 이미지

뭘 도와달란 말씀이신지...-_-;;

cjynim의 이미지

예전엔 안그랬는데 ... 본문 내용이 왜 전부 다 않나오는거죠 ??

게시물을 삭제하고 다시 질문 올리려고 했는데 삭제도 어떻게 하는지 ㅡㅡ?

winner의 이미지

icon 의 code tag button 을 누르면 대괄호형태의 code tag 가 삽입되는데 이것을 게시판이 각괄호로 변환합니다.
그런데 이 code tag 안의 내용에 각괄호가 있으면 처리가 제대로 안 되는 것 같네요.

예전 PHPBB 를 쓸 때는 잘 되었는데 Drupal 로 바뀌면서 문제가 있습니다.
직접 code tag 를 각괄호로 입력하시면 됩니다.

cleol의 이미지

코드도 맞고 설명도 맞습니다. 그리고 메모리에 민감한 프로그램이 아니더라도 제대로 해제해 주는 것이 습관상 좋겠지요. 뭐 어떻든^^;
음... 메모리 디버거, 프로파일러를 구해서 사용하시면 스스로 메모리 문제를 체크해보실 수 있습니다. 윈도에서 프로그램 연습을 하시는 것 같은데, 윈도에서 쓸만한게 뭐 있는지는 잘 모르겠습니다. 리눅스에서 연습하신다면 valgrind 가 좋습니다. gcc 컴파일시에 -g 옵션을 줘서 디버깅 정보를 생성하고, "valgrind 실행파일이름" 과 같이 실행하면 메모리 누수 문제, 잘못된 메모리 액세스(버퍼 오버 플로우 등등) 등등을 체크해서 보고해줍니다.

cjynim의 이미지

좋은 답변 감사드립니다 .. C++ 참 매력적인 언어인데 JAVA에 비해 메모리를 직접 관리해줘야 하니

여러가지로 머리가 복잡하네요 ~ ^^ 수고하세요 ~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.