new로 생성된 포인터를 안전하게 지우자. SafeDelete
페이지 정보
본문
new로 생성한 포인터를 다른 함수에서 지우는데 지우고나서 NULL로 만들어주지 않아서, 그것을 delete로 지워도 되는지 판단할 수가 없는데 이미 지워진 것인지 판별해 내는 방법을 물으신적이 있습니다.
그때는 잘 몰랐는데, Win32에서 제공하는 Exception Handling을 활용하면 된다는것을 알았습니다. 그래서 만들어 본 것이, SafeDelete template입니다. SafeDelete는 인자로 넘어온 변수를 안전하게 delete해 주는 함수입니다.
우선 소스를 보시죠.
template < class _DataType >
BOOL SafeDelete(_DataType **pDT)
{
if (*pDT == NULL)
return FALSE;
__try
{
delete *pDT;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
*pDT = NULL;
return FALSE;
}
*pDT = NULL;
return TRUE;
}
이와 같습니다. 사용법은..
char *p;
SafeDelete< char >(&p);
이와 같습니다.
위에서 p가 할당되지 않았는데 SafeDelete로 지웠습니다.
그냥 delete하게되면 ACCESS_VIOLATION에러가 뜨겠지요.
p가 이미 NULL로 되어있다면 SafeDelete는 그냥 빠져 나오며, NULL이 아닌데 이미 delete로 지워진 포인터면 그 포인터를 NULL로 바꾸어주어 다음부터는 delete시도를 하지 않도록 해줍니다.
템플리트로 만들었으므로 임의의 타입에도 적용할 수 있습니다.
그리고 굳이 template을 쓰지 않아도....
#define SAFEDELETE(x) SafeDelete((void **) &(x))
BOOL SafeDelete(void **ptr)
{
if(*ptr == NULL)
return FALSE;
__try
{
delete *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
*ptr = NULL;
return FALSE;
}
*ptr = NULL;
return TRUE;
}
사용 방법은 걍 SAFEDELETE(p); 해주시믄 됩니다.
그때는 잘 몰랐는데, Win32에서 제공하는 Exception Handling을 활용하면 된다는것을 알았습니다. 그래서 만들어 본 것이, SafeDelete template입니다. SafeDelete는 인자로 넘어온 변수를 안전하게 delete해 주는 함수입니다.
우선 소스를 보시죠.
template < class _DataType >
BOOL SafeDelete(_DataType **pDT)
{
if (*pDT == NULL)
return FALSE;
__try
{
delete *pDT;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
*pDT = NULL;
return FALSE;
}
*pDT = NULL;
return TRUE;
}
이와 같습니다. 사용법은..
char *p;
SafeDelete< char >(&p);
이와 같습니다.
위에서 p가 할당되지 않았는데 SafeDelete로 지웠습니다.
그냥 delete하게되면 ACCESS_VIOLATION에러가 뜨겠지요.
p가 이미 NULL로 되어있다면 SafeDelete는 그냥 빠져 나오며, NULL이 아닌데 이미 delete로 지워진 포인터면 그 포인터를 NULL로 바꾸어주어 다음부터는 delete시도를 하지 않도록 해줍니다.
템플리트로 만들었으므로 임의의 타입에도 적용할 수 있습니다.
그리고 굳이 template을 쓰지 않아도....
#define SAFEDELETE(x) SafeDelete((void **) &(x))
BOOL SafeDelete(void **ptr)
{
if(*ptr == NULL)
return FALSE;
__try
{
delete *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
*ptr = NULL;
return FALSE;
}
*ptr = NULL;
return TRUE;
}
사용 방법은 걍 SAFEDELETE(p); 해주시믄 됩니다.
댓글목록
등록된 댓글이 없습니다.