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++에서는 매크로 함수보다는 템플릿 함수를 권장
'C and C++' 카테고리의 다른 글
[C++] 자원관리 Smart Pointer (shared_ptr) (0) | 2018.06.17 |
---|---|
[C++] 상속을 허용하는 Base 클래스의 소멸자는 반드시 가상(virtual) 소멸자로 선언 (0) | 2018.06.03 |
[C++] 기본으로 만들어지는 생성자,복사 생성자, 소멸자, 대입 연산자와 이를 금지하는 방법 (0) | 2018.05.26 |
[C++] 객체를 초기화 할때는 생성자 초기화 리스트를Initialize List) 사용하기 (0) | 2018.05.13 |
[C++] #define은 지양하자 (0) | 2018.05.06 |