💡 동적 메모리를 할당받은 포인터 변수를 할당받기 전과 해제한 후에 NULL을 대입하여 메모리 접근 오류를 방지!
💡 2차원 배열을 동적 할당으로 열었을 경우엔 다음과 같이 "초기화" 및 "할당" 후 "해제" 시켜주자!
// 포인터 선언 및 초기화
short** ppsImages = NULL; // NULL로 초기화 꼭 해주고 할당 및 해제!
// 메모리 할당
short** ppsImage = new short*[nHeight];
for (int row = 0; row < nHeight; row++){
ppsImage[row] = new short[nWidth]; // 각 행의 열 값들도 동적 할당 (메모리 열기)
memset(ppsImage[row], 0, sizeof(short)*nWidth); // 메모리 공간을 0으로 채우기
}
// 메모리 해제 sol1
for (int row = 0; row < nHeight; row++){
delete [] ppsImage[i];
}
// 메모리 해제 sol2 => 해제 마지막에 꼭 NULL 대입! (for. 댕글링 포인터 방지)
#define SAFE_DELETE_ARRAY(p) { if(p) delete[](p); p = NULL;}
#define SAFE_DELETE_VOLUME(p, depth) { if(p) {for (int i=0;i<depth;i++) if(p[i]) delete[](p[i]); } delete[] p; p=NULL;};
SAFE_DELETE_ARRAY(pusImage); // 1차원 배열일 때
SAFE_DELETE_VOLUME(ppsImages , nImageCnt); // 2차원 배열일 때 (배열명, 1차원 배열 수)
cf. 참고
https://felixblog.tistory.com/72
https://grandstayner.tistory.com/entry/C-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9
cf. 댕글링 포인터
'[ 언어 및 문법 ] > C, C++' 카테고리의 다른 글
[C++] 가비지(Garbage) & 가비지 컬렉션(Garbage Collection) / 포인터 & 메모리 동적할당 (0) | 2022.08.14 |
---|---|
[C++, OpenCV] Convert Arr2Mat, Mat2Arr / 16bit(short) to 8bit(unsigned char) / CV_type (0) | 2022.08.14 |
[C++] 전방 선언 (Forward Declaration) (0) | 2022.08.14 |
[C++] 정적 변수(Static) vs 전역 변수(Global) , const (0) | 2022.08.14 |
[C++] 포인터, 주소연산자(&), 배열, 동적할당, 자료형 + vs 참조형 변수(&) (0) | 2022.08.13 |