--------------------------------------------------------------------------------------------------
[변경 전]
// new (new char)로 생성된 메모리 p를 제거 합니다.
#define SAFE_DELETE( p ) { if( p ) { delete ( p ); ( p ) = NULL; } }
// new (new char *) 로 생성된 배열 p를 제거 합니다.
#define SAFE_DELETE_ARRAY( p ) { if( p ) { delete[] ( p ); ( p ) = NULL; } }
// 참고 ( 수정은 하지 않음 )
// : 생성된 객체 모듈 p를 제거 합니다.
( Release() : Release Reference count를 의미하며 COM 객체에게 자신이 더 이상 참조하고 있지 않다는
것을 알리는 역할을 수행하며 카운트를 감소시켜 준다. )
#define SAFE_RELEASE(p) { if ( (p) ) { (p)->Release(); (p) = 0; } }
--------------------------------------------------------------------------------------------------
출처: http://jujubong.tistory.com/146
[변경 후 : #define 으로 구현한것 보다는 디버깅하기 쉽다.]
template< typename T >
inline void SAFE_DELETE( T & p ) { delete p; (p) = NULL; }
template< typename T >
inline void SAFE_DELETE_ARRAY( T & p ) { delete[] p; (p) = NULL; }
template< typename T >
inline void SAFE_DELETE_ARRAY_OBJ(T & p, int n)
{ if (p) { for (int i = 0; i < n; i++) { SAFE_DELETE((p)[i]); } delete[] (p); p= NULL; } }
template< typename T >
inline void SAFE_DELETE_ARRAY_ARRAY( T & p, int n )
{ if (p) { for (int i = 0; i < n; i ++) { SAFE_DELETE_ARRAY((p)[i]); } delete[] (p); p = NULL; } }
==================================================================================================
출처 : http://www.debuglab.com/knowledge/freedelete.html
[안전하게 free, delete하는 방법]
1. 요약 : 안전하게 free, delete하는 방법을 설명합니다.
2. 본문
너무 간단하고 이미 많은 사람들이 사용하는 팁일지도 모르겠습니다.
다 알고 계시듯이 free, delete를 잘못하는 경우는 run-time error가 나게 되며, 쉽게 잘못된 곳을 찾기 힘든
경우가 종종 있습니다. free, delete로 비롯되는 run-time error와 memory leak을 막기위해 간단한 매크로를
만들어 사용하기도 하는 데 여기서는 그 매크로를 소개합니다. 이 매크로는 우선 포인터를 검사하여 포인터가 NULL이 아닌 경우만 free나 delete를 하고, 그 포인터를 NULL로 만들어 다시 SAFE_FREE나 SAFE_DELETE를 하여도 에러를 발생시키지 않습니다. 한 가지 주의하실 점은 이 메크로를 이용하기에 앞서 포인터를 NULL로 초기화 해 주어야 한다는 것입니다. 정상적으로 malloc이나 new가 먼저 수해되면 관계가 없으나 초기화가 수행되기 전에 SAFE_FREE나 SAFE_DELETE 문이 수행되면 run-time error가 나기 때문입니다.
#ifndef SAFE_DELETE #define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } #endif // SAFE_DELETE #ifndef SAFE_FREE #define SAFE_FREE(p) { if(p) { free(p); (p) = NULL; } } #endif // SAFE_FREE
3. 예제
//선언부
LPSTR m_pStr ;
CDSPlay *m_pDSPlay ;
// 초기화 부분에서(대게 클래스의 생성자가 되겠지요)
m_pStr = NULL;
m_pDSPlay = NULL;
// 메모리 할당
m_pStr = (LPSTR)malloc(1024);
m_pDSPlay = (CDSPlay *)new CDSPlay();
// 메모리 소거 및 소멸자에서(여러번 수행되어도 관계없슴)
SAFE_FREE(m_pStr);
SAFE_DELETE(m_pDelete);
- 2001.08.13 Smile Seo -
==================================================================================================
'IT_Programming > C · C++' 카테고리의 다른 글
[펌] MySQL 최적화 c api 소스 (0) | 2009.09.16 |
---|---|
[C++] 스마트 포인터(Smart Pointer) 맛보기 (0) | 2009.09.15 |
[펌_Win32 C++] Configuration MS SQL Express, ODBC DSN with Win32 C++ (0) | 2009.08.06 |
[C] 해당경로의 파일만 출력하기 / 하위 디렉토리도 검사 (0) | 2009.07.01 |
[펌] C/C++ 퍼포먼스와 footprint (0) | 2009.06.25 |