// 스마트 포인터 설계 기법
#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;
}
'Developer > Design Patterns' 카테고리의 다른 글
Strong Pointer & Weak Pointer (0) | 2014.05.18 |
---|---|
Proxy Pattern을 이용한 스마트포인터 방식 (0) | 2014.05.18 |
함수포인터, 함수객체를 사용한 인라인 치환 (0) | 2014.05.18 |
Factory Pattern을 이용한 도형 만들기 (0) | 2014.05.17 |
컴포지트 패턴을 이용한 메뉴구성 (0) | 2014.05.17 |