[C++] delete시 주의점
unmanaged 언어인 c++에서 메모리 관리는 전적으로 개발자가 해야한다.
malloc이나 new로 메모리가 할당된 객체를 delete,free할 때 delete 후 NULL을 할당해 주지 않고 실수로 다시 한번 객체를 delete,free하게 된다면 segmentation fault가 발생한다.
결론적으로 template 함수로 delete와 null할당을 해주면 편할 것 같다.
#include<stdio.h> #include<iostream> using namespace std; class Test{
}; void endProgram(Test *t){ if(t){ printf("endProgram object t delete\n"); delete t; } } void readyForEnd(Test * t){ if(t){ printf("readyForEnd object t delete\n"); delete t; } endProgram(t); } int main(void){ Test * t1 = new Test(); readyForEnd(t1); return 0; } 해결책은 템플릿 함수로 safe delete를 만들어 두자 #include<stdio.h> #include<iostream> template <typename T> void safe_delete(T& p){ delete p; p = NULL; } using namespace std; class Test{
}; void endProgram(Test *t){ printf("endProgram object t delete\n"); safe_delete(t); } void readyForEnd(Test * t){ printf("readyForEnd object t delete\n"); safe_delete(t); endProgram(t); } int main(void){ Test * t1 = new Test(); readyForEnd(t1); return 0; } |
*ps c++에서 delete와 free는 수행하기 전에 포인터의 NULL을 확인할 필요는 없다.
delete,free함수 내에서 NULL check를 함.
c++에서는 매크로 함수보다는 템플릿 함수를 권장