Re: If GC is the solution, then what is the problem?
In article <1154085192.151714.224390@i42g2000cwa.googlegroups.com>,
kanze <kanze@gabi-soft.fr> wrote:
Another concern with boost::shared_ptr is that once an object is
controlled by a shared_ptr, you cannot use other pointers with
it. I do a lot of multi-threaded work, and it is a basic rule
that when passing objects between threads, auto_ptr is used;
once you've handed the object off, accessing it is a major
programming error. (I even use auto_ptr with garbage collection
here. Because I'm not really using it for memory management,
but for its more general ownership semantics.) Once a
shared_ptr has control of an object, however, it can't
relenquish it, so you can't make an auto_ptr out of it.
I am not sure you can't you can create a deleter that either
deletes or not according to a member of the deleter. You obviously
don't want an auto_ptr of a shared_ptr that really is sharing the ptr
with more than itself. A shared_ptr provides unique() and get_deleter
that get the deleter that said you can just modify the contents of the
deleter. something like this comes to mind.
// begin code
#include <memory>
template <class T>
class auto_ptr_deleter
{
bool do_delete;
public:
explicit auto_ptr_deleter():do_delete(true){}
void reset() {do_delete = false;}
void operator () (T *p)
{
if(do_delete) delete p;
}
};
struct bad_make_auto_ptr_call{};
template <class T>
std::auto_ptr<T> make_auto_ptr(std::tr1::shared_ptr<T> &sp)
{
auto_ptr_deleter<T> *deleter;
/* is this shared_ptr really not sharing and is its deleter
auto_ptr_delete<T>()? If not throw exception else
we can convert it to an auto_ptr.
*/
if(!sp.unique() || !(deleter =
std::tr1::get_deleter<auto_ptr_deleter<T> >(sp)))
throw bad_make_auto_ptr_call();
deleter->reset();
std::auto_ptr<T> auto_p(sp.get());
sp.reset();
// sp no is a shared_ptr<T>() so it cant be dereferenced.
return auto_p;
}
// end code
FWIW this works with cw 9.x/macosx 31 lines of write once
code [if comments are removed].
Never say never:) Should work with boost's implementation
as if is valid in tr1.
Not automatic but if there is any reason to convert a shared_ptr
to an auto_ptr it is possible.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]