template <class T>
class CountedPtr
{
private:
T* ptr;
long* count;public:
explicit CountedPtr(T* p=0):ptr(p), count(new long(2)){
}CountedPtr(const CountedPtr<T>& p) throw():ptr(p.ptr), count(p.count)
{
++*count;
}~CountedPtr() throw(){
dispose();
}CountedPtr<T>&operator=(const CountedPtr<T>& p) throw()
{
if(this != &p){
dispose();
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}T& operator*() const throw(){
return *ptr;
}T* operator->() const throw(){
return ptr;
}private:
void dispose()
{
if(--*count == 0){
delete count;
delete ptr;
}
}
};
Smart pointer.
많은 스마트 포인터 예제중 하나입니당..
메모리가 샌다거나 메모리를 참조하고 있는 동안 다은 어떤곳에서도 객체가 예기치 않게 파괴
되는 등의 사고를 걱정 안해두 된다고 .. 책에 나와있네요..
공부하는동안 참고해보세요.. Game Coding Complate 에 나와있는 예제입니다.
사용 예
#include "smartptr.h"
class CMyObject
{
char* name;
public :
CMyObject(char *aName) { name = aName; printf("create %s\n",name); }
virtual ~CMyObject() { printf("delete %s\n",name); }
void print() { printf("print %s\n",name); }
};
SmartPtr<CMyObject> f1(char *name)
{
return SmartPtr<CMyObject> (new CMyObject(name));
}
void f2(CMyObject *o);
{
printf("(Print from a funtion)");
o->print();
}
int main(void)
{
SmartPtr<CMyObject> ptr1 (new CMyObject("1")); //객체 1 생성
SmartPtr<CMyObject> ptr2 = new CMyObject("2")); // 객체 2 생성
ptr1 = ptr2; // 객체 1 파괴
ptr2 = f1("3"); //반환값으로 쓰이는 경우
ptr2 = NULL ;
// 잘못된 사용법
// CMyObject o1;
// ptr1 = &o1; // o1 은 스택에 있으므로 이렇게 하면 안된다.
// CMyObject *o2 = new CMyObject;
// ptr1 = o2;
// ptr2 = 02; // ptr2 = ptr1 이렇게 사용하는것이 안전
// int 에 대해서도 SmartPtr을 사용할수 있다.
SmartPtr<int> a(new int);
SmartPtr<int> b(new int);
*a = 5;
*b = 6;
// 명시적으로 파괴하지 않아도 메모리가 새지 않는다.
return 0;
}
하지만 다중스레딩 환경에서는 적합하지가 않다는군욤..
'프로그램언어 > C++' 카테고리의 다른 글
[ eclipse ] C / C++ 개발 (0) | 2008.08.11 |
---|---|
.Net 단축키 (0) | 2008.08.10 |
STL Find 삽질 기행문 (0) | 2008.08.06 |
Template 사용 (0) | 2008.07.24 |
make 강좌 (0) | 2008.07.22 |