|
Boost Users : |
From: Nicola Musatti (yg-boost-users_at_[hidden])
Date: 2002-10-08 08:06:36
Stephan Born wrote:
> Hello!
>
> I do some experiments on shared_ptr and weak_ptr. So I tried to use them
> for a singleton-class, which does not need an explicit
> singleton::release_instance method. The singleton-instance will be
> destroyed everytime the last external shared_ptr holding the instance
> goes out of scope. Is this a valid usage for weak_ptr? Are there any
> traps I do not see using these smart_ptrs in this context?
Within the singleton class I hold the instance with a shared_ptr. I
consider this the best option, as it guarantees the correct order of
destruction when a singleton depends on another one.
> The drawback of using shared_ptr with singleton is the need for a public
> destructor. But this is dangerous....it is possible to write
>
> singleton::singleton_ptr first_ptr = singleton::instance();
> delete first_ptr.get();
You should rely on the constructor that takes an additional deleter
argument, something like (not compiled and almost certainly incomplete
and incorrect):
class SingletonDeleter {
friend class shared_ptr<Singleton>;
operator() (Singleton *p) { delete p; }
};
class Singleton {
friend class SingletonDeleter;
public:
shared_ptr<Singleton,SingletonDeleter> instance() {
if ( inst == 0 )
inst = shared_ptr<Singleton,SingletonDeleter> (
new Singleton,SingletonDeleter());
return inst;
}
};
typedef shared_ptr<Singleton,SingletonDeleter> SingletonPtr;
> Declaring the destructor as private is only possible when defining
> boost::checked_delete as friend of the singleton-class.
[...]
> But then it is still possible to write the following code
>
> singleton::singleton_ptr first_ptr = singleton::instance();
> boost:checked_delete( first_ptr.get() );
>
> OK, it's very unlikely to do it by chance, but it is possible.
Moreover, you rely on what should be an implementation detail.
Cheers,
Nicola Musatti
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net