자원 할당된 객체의 자동 해제


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 코드를 타지 않아서 메모리가 새거나 객체 메모리 관리가 어려워지는 시점을 미연에 방지함..

+ Recent posts