자원 할당된 객체의 자동 해제
auto_ptr
- 소멸시 메모리 해제
- 복사시 기존 포인터 null 처리 ( pA = pB, pB는 null 이 됨 )
delete NULL 은 표준상 문제가 안 되지만,
NULL 객체가 참조할 경우에 문제 발생. ( pB->doSomething(); //error )
사용예:
std::auto_ptr<CDiaglog> p(new CDialog);
p->Create(CDialog::IDD);
shared_ptr
- boost에서 tr1 에 포함 됨. ( namespace: std::tr1::shared_ptr )
- Reference Counting, 객체가 할당/복사 될 때 카운팅, 카운팅이 0이 될 때 자동 해제
사용예:
std::tr1::shared_ptr<CDialog> p(new CDialog);
p->Create(CDialog::IDD);
shared_ptr 삭제자
- 자동 호출 메모리 삭제가 될 때, 기본 동작대신 사용자 지정된 코드를 호출함
사용예:
struct deleter
{
templete<typename T>
void operator()(T* p)
{
//이 곳에 동작할 코드를 넣습니다.
p->DestoryWindow();
delete p; // 배열은 delete [] p;
}
}
함수호출....
{
std::tr1::shared_ptr<CDialog> p(new CDialog, deleter());
p->Create(CDialog::IDD);
} //함수 반환되고, 로컬 객체 제거되며, deleter()가 호출됨.
벡터와의 결함
std::vector<int *> vt;
vt.erase(vt.begin(), vt.end()); // 원소만 제거되고 메모리는 릭이 발생
// 별도로 for 문을 돌면서 delete 해야하는 상황이 발생
std::vector<std::tr1::shared_ptr<int>> vt; // shared_ptr을 원소 타입으로 갖음
vt.erase(vt.begin(), vt.end()); // 원소만 제거해도, shared_ptr 이므로 자동으로 해제됨.
일반적으로 자동 해제 객체를 사용하는 것이 여러모로 안전하고 편리함...
흐름대로 동작하지 않아서 delete 코드를 타지 않아서 메모리가 새거나 객체 메모리 관리가 어려워지는 시점을 미연에 방지함..