#include <iostream>
using namespace std;
class RefBase {
int mCount;
public:
RefBase() : mCount(0) {}
virtual ~RefBase() {}
void incStrong() { ++mCount; }
void decStrong() { if((--mCount)==0) delete this; }
};
class Car : public RefBase {
public:
Car() { cout << "Car()" << endl; }
~Car() { cout << "~Car()" << endl; }
void go() { cout << "Go! Go! Go!" << endl; }
};
template<typename T> class Sptr {
T* ptr;
public:
// 객체 생성 후 참조 계수 증기
Sptr(T* p) : ptr(p) {
if(ptr) ptr->incStrong();
}
// 객체 복사 후 참조 계수 증기
Sptr(const T& o) : ptr(o) {
if(ptr) ptr->incStrong();
}
// 객체 소멸 후 참조 계수 감소
~Sptr() {
if(ptr) ptr->decStrong();
}
// 스마트 포인터는 아래의 연산자를 반드시 제공해야한다.
T* operator->() { return ptr; }
T& operator*() { return *ptr; };
};
int main() {
Sptr<Car> p =new Car;
Sptr<Car> q = p;
//안드로이드 sp - 장점 : 메모리 최적화
// 단점 : RefBase의 자식만 처리가능
//표준에서 지원하는 shared_ptr - 장점 : 모든 타입 처리 가능
// 단점 : 메모리의 낭비가 발생
}
'Developer > Design Patterns' 카테고리의 다른 글
State Pattern (0) | 2014.05.18 |
---|---|
Strong Pointer & Weak Pointer (0) | 2014.05.18 |
참조계수 방식의 스마트 포인터 (0) | 2014.05.18 |
함수포인터, 함수객체를 사용한 인라인 치환 (0) | 2014.05.18 |
Factory Pattern을 이용한 도형 만들기 (0) | 2014.05.17 |