2009. 6. 26. 15:36

shared_ptr tip

1. prohibit delete raw pointer( use protected destructor )

class A
{
public:
virtual void sing() = 0;
protected:
virtual ~A() {}
};

class B : public A
{
public:
virtual void sing()
{
std::cout <<"Do re mi fa so la";
}

};

boost::shared_ptr<A> createA()
{
boost::shared_ptr<A> p ( new B() );
return p;
}

int main()
{
boost::shared_ptr<A> test = createA()
delete test.get();  // compile error  because ~A is protected
}

2. prohibit delete raw pointer( nest class)

class A
{
class deleter
{
public:
void operator() (A * p )
{
delete P;
}
};

friend class deleter;

public:
virtual void sing()
{
std::cout << "Lalalalalalalala";
}

static boost::shared_ptr<A> createA()
{
boost::shared_ptr<A> p(new A(), A::deleter() );
return p;
}

protected:
virtual ~A() {}
};