스마트 포인터
- 동적 생성된 객체를 가리키는 포인터 자료형을 흉내내어 만든 클래스
- ->와, * 연산자를 오버로딩하여 포인터와 같은 역할을 수행
- 동적 생성된 객체를 자동으로 해제하는 기능 제공
- 다양한 타입을 지원하기 위해 클래스 템플릿으로 정의
- shared_ptr, unique_ptr, weak_ptr, etc in C++11
- Ptr in OpenCV
#include <iostream>
#include <memory>
using namepsace std;
class Rect {
public:
Rect() { cout << "Rect constructor!" << endl; }
~Rect() { cout << "Rect destructor!" << endl; }
void draw() { cout << "Rect drawn!" << endl; }
};
class Ptr {
Rect* obj;
public:
Ptr(Rect* p = 0) : obj(p) { cout << "Ptr constructor!" << endl; }
~Ptr() {
cout << "Ptr destructor!" << endl;
if (obj) delete obj;
}
Rect* opreator ->() { return obj; }
};
int main()
{
Rect rc;
rc.draw();
Rect* pRect = new Rect();
pRect -> draw();
Ptr rc = new Rect();
rc->draw();
return 0;
}
- Ptr 처럼 typname이 정해져있는게 아니라 템플릿 형태로 받으면 더 유용할 것이다.
...
template<typename T> class Ptr {
T* obj;
public:
...
}
int main()
{
...
Ptr<Rect> rc = new Rect();
return 0;
}
- Ptr<\Rect> rc2 = rc; 같이 복사하면 메모리를 두번 해제하면서 오류가 발생된다. 위 처럼 만들려면 예외 처리를 굉장히 잘해야됨.. 그래서 C++ 에서 shared_ptr 사용 !
...
int main()
{
...
shared_ptr<Rect> rc2 = new Rect();
rc2->draw();
return 0