[완료] C++ 메모리 동적 할당 및 해제에 대해서 확실히 해두고 싶습니다 ~ 도와주세요 ~
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++을 처음 공부하다 보니까 이것저것 정신이 없습니다 ... 그럼 지금까지 읽어주셔서 고맙습니다 ..
오늘 하루도 즐프, 열공 하세요 ~
뭘 도와달란
뭘 도와달란 말씀이신지...-_-;;
이거 왜 이러죠?
예전엔 안그랬는데 ... 본문 내용이 왜 전부 다 않나오는거죠 ??
게시물을 삭제하고 다시 질문 올리려고 했는데 삭제도 어떻게 하는지 ㅡㅡ?
code tag 를 직접 쓰셔야 할 듯..
icon 의 code tag button 을 누르면 대괄호형태의 code tag 가 삽입되는데 이것을 게시판이 각괄호로 변환합니다.
그런데 이 code tag 안의 내용에 각괄호가 있으면 처리가 제대로 안 되는 것 같네요.
예전 PHPBB 를 쓸 때는 잘 되었는데 Drupal 로 바뀌면서 문제가 있습니다.
직접 code tag 를 각괄호로 입력하시면 됩니다.
코드도 맞고 설명도
코드도 맞고 설명도 맞습니다. 그리고 메모리에 민감한 프로그램이 아니더라도 제대로 해제해 주는 것이 습관상 좋겠지요. 뭐 어떻든^^;
음... 메모리 디버거, 프로파일러를 구해서 사용하시면 스스로 메모리 문제를 체크해보실 수 있습니다. 윈도에서 프로그램 연습을 하시는 것 같은데, 윈도에서 쓸만한게 뭐 있는지는 잘 모르겠습니다. 리눅스에서 연습하신다면 valgrind 가 좋습니다. gcc 컴파일시에 -g 옵션을 줘서 디버깅 정보를 생성하고, "valgrind 실행파일이름" 과 같이 실행하면 메모리 누수 문제, 잘못된 메모리 액세스(버퍼 오버 플로우 등등) 등등을 체크해서 보고해줍니다.
좋은 답변 감사드립니다 ..
좋은 답변 감사드립니다 .. C++ 참 매력적인 언어인데 JAVA에 비해 메모리를 직접 관리해줘야 하니
여러가지로 머리가 복잡하네요 ~ ^^ 수고하세요 ~
댓글 달기