IT_Programming/C · C++

[펌_C++] SAFE_DELETE 를 template으로 구현!

JJun ™ 2009. 8. 12. 11:15

--------------------------------------------------------------------------------------------------

 

[변경 전]

 

// 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 -

 

==================================================================================================