'Developer/Design Patterns'에 해당되는 글 27건

  1. 2014.05.18 참조계수 방식의 스마트 포인터

// 스마트 포인터 설계 기법

 

#include <iostream>

using namespace std;

 

class Car {

public:

        Car() { cout << "Car()" << endl; }

        ~Car() { cout << "~Car()" << endl; }

 

        void go() { cout << "Go! Go! Go!" << endl; }

};

 

// 스마트 포인터 도입

// 포인터를 객체로 만들 경우, 사용자가 생성/복사/대입/소멸의 모든과정을 제어할 있다.

// 스마트 포인터를 활용한 : 소멸자를 사용한 객체의 소멸

 

template<typename T> class Strp {

        T *ptr;

        int *ref;

public:

        //참조계수 방식의 생성자

        Strp(T *p =0) : ptr(p) {

               ref = new int(1);             //메모리를 동적할당하면서 초기화

        }

 

        //참조 계수 방식의 소멸자

        ~Strp() {     

               if(--(*ref) == 0) {

                       delete ptr;

                       delete ref;

               }

        }

       

        //참조 계수 방식의 소멸자

        Strp(const Strp& o) : ptr(o.ptr), ref(o.ref) {       //복사생성자

               ++(*ref);

        }

 

        // 스마트 포인터는 아래의 연산자를 반드시 제공해야한다.

        T* operator->() { return ptr; }

        T& operator*() { return *ptr; };

};

 

int main() {

        {

               //Car *p = new Car;

               Strp<Car> p=new Car;

               p->go();               //p.operator->()go()  =>  (p.operator())->go()

        }       //leak occured!!

 

        Strp<Car> p1 = new Car;

        Strp<Car> p2 = p1;            //기본 복사 생성자가 호출

        Strp<int> p = new int;

 

 

        cout << sizeof(int) << endl;

        cout << sizeof(Strp<int>) << endl;    //스마트포인터를 사용할경우 사이즈가 8이나옴 (문제점) : 

 

        return 0;

}

 

해결방법 : http://lueseypid.tistory.com/207



표준에서 제공하는 스마트 포인터

 #include <iostream>

#include <memory>

using namespace std;

 

int main() {

       

        shared_ptr<int> p(new int);

        *p=10;

        cout << *p << endl;

 

        shared_ptr<int> q(p);

 

        return 0;

}

 

 

Posted by No names
,