#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 - 장점 : 모든 타입 처리 가능

        //                             단점 : 메모리의 낭비가 발생

}

Posted by No names
,