출처 : http://blog.naver.com/psychoria?Redirect=Log&logNo=40108323175
C++은 메모리 관리를 하기가 상당히 까다로운 언어입니다.
#include <crtdbg.h>
C++은 메모리 관리를 하기가 상당히 까다로운 언어입니다.
특히 동적 할당과 관련해서는 조금만 실수하면
메모리 누수나, 메모리 접근 위반으로 프로그램이 죽기가 일쑤입니다.
메모리 누수란 프로그램이 종료시까지는 할당한 모든 메모리가해제가 되어야 하는데
할당된 메모리가 해제가 되지 않을 때 발생하는 문제이고,
메모리 접근 위반은 초기화되지 않은 포인터 혹은 동적 할당된 범위 밖을 호출할 때 발생합니다.
초기화되지 않은 포인터는 어떻게 작동할 지 예측을 할 수 없습니다.
(10중 8, 9는 프로그램이 죽는다고 보면 됩니다.)
new 사용 시에 주의할 점은 다음과 같습니다.
new로 할당 시에는 delete로 해제하고, new[]로 할당 시에는 delete[]로
해제해줘야 한다는 것입니다.
C++을 공부한 입장에서는 너무도 당연한 이야기겠지만,
사실 신경쓰지 않고 사용했다가 나중에 메모리 누수가 났을 때,
디버깅시에 상당히 오랜 시간을 투자해야할 수도 있기 때문에 꼭 다시 한 번 상기하시기 바랍니다.
Effective C++에서는 다음과 같은 그림을 들어서 new를 delete[]로 해제했을 때나
new[]를 delete로 해제했을 때의 위험성을 설명합니다.
한 개를 해제하려고 하는데 갯수를 참조하게 되고,
배열을 해제하려고 하는데 크기 정보를 못 가져 오는 상황을 의미하는 거 같습니다.
실제 코드를 통해서 알아보도록 하겠습니다.
console project에서 확인하기 위해서
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
를 추가합니다.
F5를 눌러서 Debug를 실시해보면
delete가 호출되는 시점 이전의 _CrtDumpMemoryLeaks() 함수를 호출할 때
출력창에 다음과 같이 표시됩니다.
Detected memory leaks! 라는 문장이 보이네요.
메모리 누수가 생긴것이지요.
기본에 충실해야 더 나아갈 수 있는 것 같습니다.