함수에 인자로 포인터를 썼을때 그 포인터자체가 넘어가는게 아니라, 포인터에 들어있는 주소를 복사하는 또 다른 포인터 변수가 만들어 진다. 결국, 주소값이 복사 된다는 소리인데...
간단한 예로...
이렇게 함수를 만들었을때...
이런 식으로 썼을 경우 DeleteObject()를 호출한 후에 lpTest에는 어떤값이 들어갈까? 결과는 NULL이 아니다. lpTest의 값은 변하지 않는다.
왜 이런 현상이 일어나느냐 하면 DeleteObject()를 호출할 당시에 lpTest의 주소가 lpDelete로 복사가 되고 DeleteObject()안에서는 lpDelete의 값을 NULL로 만들지 lpTest 자체를 NULL로 만들지를 않는다. 결과적으로 lpTest는 쓰레기값이 남아있게 된다.
이것을 lpTest가 NULL되게끔 하기 위해서는 lpTest란 포인터의 주소값을 넘겨주면 된다. 즉, 이중 포인터를 쓰면 된다.
이런 식으로 써야지만 원하는데로 DeleteObject() 호출 후, lpTest가 NULL이 된다.
간단한 예로...
void DeleteObject( CTest *lpDelete )
{
delete lpDelete;
lpDelete = NULL;
}
{
delete lpDelete;
lpDelete = NULL;
}
이렇게 함수를 만들었을때...
int main( void )
{
CTest *lpTest = new CTest;
DeleteObject( lpTest );
}
{
CTest *lpTest = new CTest;
DeleteObject( lpTest );
}
이런 식으로 썼을 경우 DeleteObject()를 호출한 후에 lpTest에는 어떤값이 들어갈까? 결과는 NULL이 아니다. lpTest의 값은 변하지 않는다.
왜 이런 현상이 일어나느냐 하면 DeleteObject()를 호출할 당시에 lpTest의 주소가 lpDelete로 복사가 되고 DeleteObject()안에서는 lpDelete의 값을 NULL로 만들지 lpTest 자체를 NULL로 만들지를 않는다. 결과적으로 lpTest는 쓰레기값이 남아있게 된다.
이것을 lpTest가 NULL되게끔 하기 위해서는 lpTest란 포인터의 주소값을 넘겨주면 된다. 즉, 이중 포인터를 쓰면 된다.
void DeleteObject( CTest **lpDelete )
{
delete *lpDelete;
*lpDelete = NULL;
}
int main( void )
{
CTest *lpTest = new CTest;
DeleteObject( &lpTest );
}
{
delete *lpDelete;
*lpDelete = NULL;
}
int main( void )
{
CTest *lpTest = new CTest;
DeleteObject( &lpTest );
}
이런 식으로 써야지만 원하는데로 DeleteObject() 호출 후, lpTest가 NULL이 된다.
