글수 69
아는 사람은 다 알고(?) 모르는 사람은 모를 팁입니다.
자주 보는 코드 중 이런 것이 있습니다.
[code]
#define SAFE_DELETE(x) { if (x) { delete(x); (x)=NULL; } }
[/code]
하지만... 위 코드는 사실 약간 낭비적인 코드입니다.
그럼 어떻게 해야 덜 낭비적인 코드가 될까요?
[code]
#define SAFE_DELETE(x) { delete(x); (x)=NULL; }
[/code]
이렇게 해야 약간이나마 낭비가 적습니다.
왜냐구요?
You can, however, use delete on a pointer with the value 0. This provision means that, when new returns 0 on failure, deleting the result of a failed new operation is harmless.
(MSDN에서)
...저런 이유 때문에, delete 연산자는 NULL 포인터(정확히는 0 포인터)를 삭제하면 아무것도 하지 않습니다.
참고 자료:
Visual C++ 7.1에 들어있는 delete 연산자 (디버깅 버전)
[code]
/* dbgdel.cpp, line 42 */
void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL) // <- 이 부분
return;
//.............
[/code]
디버깅용이 아닌 버전
[code]
/* delete.cpp, line 23 */
void operator delete( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0));
free( p ); // -> _free_base가 호출됩니다.
}
//...................
/* free.c, line 45 */
void __cdecl _free_base (void * pBlock)
{
if (pBlock == NULL) // <- 요놈
return;
//.............
[/code]
자주 보는 코드 중 이런 것이 있습니다.
[code]
#define SAFE_DELETE(x) { if (x) { delete(x); (x)=NULL; } }
[/code]
하지만... 위 코드는 사실 약간 낭비적인 코드입니다.
그럼 어떻게 해야 덜 낭비적인 코드가 될까요?
[code]
#define SAFE_DELETE(x) { delete(x); (x)=NULL; }
[/code]
이렇게 해야 약간이나마 낭비가 적습니다.
왜냐구요?
You can, however, use delete on a pointer with the value 0. This provision means that, when new returns 0 on failure, deleting the result of a failed new operation is harmless.
(MSDN에서)
...저런 이유 때문에, delete 연산자는 NULL 포인터(정확히는 0 포인터)를 삭제하면 아무것도 하지 않습니다.
참고 자료:
Visual C++ 7.1에 들어있는 delete 연산자 (디버깅 버전)
[code]
/* dbgdel.cpp, line 42 */
void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL) // <- 이 부분
return;
//.............
[/code]
디버깅용이 아닌 버전
[code]
/* delete.cpp, line 23 */
void operator delete( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0));
free( p ); // -> _free_base가 호출됩니다.
}
//...................
/* free.c, line 45 */
void __cdecl _free_base (void * pBlock)
{
if (pBlock == NULL) // <- 요놈
return;
//.............
[/code]
