Boost logo

Boost :

From: Maxim Egorushkin (e-maxim_at_[hidden])
Date: 2003-10-23 08:01:05


Michael Grundberg wrote:

MG> In other words, we do:

MG> // Our resource
MG> int i;

MG> // Give it to the library
MG> boost::shared_ptr<int> p1(&i, null_deleter());
MG> std::set<boost::shared_ptr<int> > s; s.insert(p1);

MG> // A bit later
MG> boost::shared_ptr<int> p2(&i, null_deleter());
MG> s.erase(p2);

MG> Which doesn't remove the pointer from s. This is causing us alot of
MG> bugs, since the compilations succeed but the code is broken.

Looks like you are misusing shared_ptr<>.

The key point is that shared_ptr<> is an exclusive owner of a raw pointer. No more then one shared_ptr<> should be constructed using the same raw pointer (unless it is 0 pointer). Violating the rule leads to multiple releases on the raw pointer. Using null_deleter allows you to remain unpunished :).

So, as a unique raw pointer has the only associated shared_counters, operator<() can be implemented using not a raw pointer but its shared_counters.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk