new로 생성된 포인터를 안전하게 지우자. SafeDelete > MFC Tip

본문 바로가기
사이트 내 전체검색

MFC Tip

new로 생성된 포인터를 안전하게 지우자. SafeDelete

페이지 정보

profile_image
작성자 이즈
댓글 0건 조회 627회 작성일 06-12-26 23:47

본문

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); 해주시믄 됩니다.

댓글목록

등록된 댓글이 없습니다.

Total 172건 11 페이지

검색

회원로그인

회원가입

사이트 정보

컴퓨터 정보,윈도우즈,리눅스,포토샵,3ds
맥스,프로그래밍 강좌팁

접속자집계

오늘
448
어제
359
최대
5,287
전체
636,154
Copyright © www.qdata.co.kr All rights reserved.