|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2001-04-05 12:10:25
From: "Gary Powell" <Gary.Powell_at_[hidden]>
> >>
> > AFAIK auto_ptr_ref supports passing/returning auto_ptrs by value. I
think
> > that this is unnecessary for boost::auto_ptr, since
> > (1) we have
> > boost::shared_ptr for this,
> <<
> I was thinking of dropping boost::auto_ptr.
> But I'm open to comments here.
>
> Toss::
> Because std:auto_ptr is everywhere and does everything except the
sizeof(T)
> test at the call to delete, and IMO that isn't enough justification for
> replacing it.
>
> Keep:
> The my reason for keeping it, is that this change should become part of
> std::auto_ptr and in order to prove to the library committee that its
worth
> doing, there should be some prior usage.
I think (as Steve Cleary pointed out) that the current rules allow
std::auto_ptr to check for incomplete types.
Whether we need boost::auto_ptr is an interesting question. I'd always use
std::auto_ptr, especially in interfaces (to reduce couplings.) Then again, I
don't see the point in having boost::scoped_ptr either, but obviously others
disagree. :-)
> > (2) passing auto_ptrs by value instead of
> > non-const reference is dangerous (exception safety), and
> <<
> I thought that was the second main purpose of auto_ptr. See
> shared_ptr<>(auto_ptr<>() ); constructor, and assignment.
I prefer
void f(auto_ptr<int> & p1, auto_ptr<int> & p2);
over
void f(auto_ptr<int> p1, auto_ptr<int> p2);
since
f(auto_ptr<int>(new int(1)), auto_ptr<int>(new int(2)));
may leak.
> > (3) returning
> > std::auto_ptrs by value is sometimes useful since std::auto_ptr is
> > standard,
> > but boost::auto_ptr is not, so it doesn't need this "capability."
> <<
> Again, I thought this was the third main purpose of auto_ptr, returning a
> pointer to allocated memory, forcing the calling function to take
ownership,
> and not leak memory.
True, but you can return a shared_ptr as well. The standard doesn't have a
shared_ptr, so std::auto_ptr has been "enhanced" to support this idiom.
My other point is that when I'm designing an interface
std::auto_ptr<X> factory();
I'd prefer std::auto_ptr over boost::auto_ptr in order to not force clients
to use boost.
[...]
> This way if shared_array( auto_array_ptr<>(new T[n] ) throws when it
> allocates the new for the pointer to the counter it won't leak the T[n].
shared_array(new T[n]) will not (should not :-) ) leak.
-- Peter Dimov Multi Media Ltd.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk