Smart Pointers : auto_ptr and array

M

mosfet

Hi,

Let's say I have a vector of auto_ptr defined like this :

vector< auto_ptr<T> > v;

is it allowed ?
Is there any side effects ?

If it's not a good idea, how can I fix this ?
 
S

Stefan Naewe

Hi,

Let's say I have a vector of auto_ptr defined like this :

vector< auto_ptr<T> > v;

is it allowed ?
Is there any side effects ?

No. Not allowed. Might not compile. Don't !
If it's not a good idea, how can I fix this ?

std::vector<boost::shared_ptr<T> > v;


S.
 
J

James Kanze

* mosfet:
No, because auto_ptr is not copyable, and a good compiler will
complain.
Yes, if it compiles.

I'm no longer very sure about this---the specification of
auto_ptr seems to change each time I look---but wasn't the
motivation behind its use of auto_ptr_ref, or whatever,
precisely so that trying to instantiate std::vector on one
couldn't compile?
 
A

Alf P. Steinbach

* James Kanze:
I'm no longer very sure about this---the specification of
auto_ptr seems to change each time I look---but wasn't the
motivation behind its use of auto_ptr_ref, or whatever,
precisely so that trying to instantiate std::vector on one
couldn't compile?

You're asking more than I currently know. I probably did know that at
one time, and I think Howard Hinnant knows. The auto_ptr_ref trick
enables construction from a temporary (into a copy constructor with
non-const formal arg), but what its main motivation was...
 
J

James Kanze

* James Kanze:
You're asking more than I currently know. I probably did know that at
one time, and I think Howard Hinnant knows. The auto_ptr_ref trick
enables construction from a temporary (into a copy constructor with
non-const formal arg), but what its main motivation was...

It may even date before his time:).

I know that auto_ptr went through at least three versions before
the first CD, and IIRC, auto_ptr_ref was originally introduced
because the British national body threatened to vote no on the
standard unless something was done to prevent instantiation of a
container on an auto_ptr. Since then: the version in the 2003
version of the standard is significantly different than that in
the 1998, so it continued to move after I stopped looking.

About all I know is that today, I can generally use it for the
purposes I want it for, with just about any compiler. Which is
considerable progress.
 
H

Howard Hinnant

James Kanze said:
It may even date before his time:).

I know that auto_ptr went through at least three versions before
the first CD, and IIRC, auto_ptr_ref was originally introduced
because the British national body threatened to vote no on the
standard unless something was done to prevent instantiation of a
container on an auto_ptr. Since then: the version in the 2003
version of the standard is significantly different than that in
the 1998, so it continued to move after I stopped looking.

About all I know is that today, I can generally use it for the
purposes I want it for, with just about any compiler. Which is
considerable progress.

See the latest working draft:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2284.pdf

for the latest change in the continually evolving auto_ptr:

It's deprecated. ;-)

Currently the best write up I have on auto_ptr, why it is deprecated,
and its replacement unique_ptr (which *will* work in containers) is:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1856.html#20.4.5
%20-%20Class%20template%20auto_ptr

-Howard
 
J

James Kanze

See the latest working draft:

for the latest change in the continually evolving auto_ptr:

It's deprecated. ;-)
Currently the best write up I have on auto_ptr, why it is deprecated,
and its replacement unique_ptr (which *will* work in containers) is:

So you invent a new name for something which serves more or less
the same purpose.

Just curious, but why the new name? Are there any legal uses of
auto_ptr that won't work exactly the same with unique_ptr? And
if not, why not call it auto_ptr, assuming that that doesn't
break any working code? (I use auto_ptr a lot in multithreaded
programs, even when I'm also using the Boehm collector.)
 
H

Howard Hinnant

James Kanze said:
So you invent a new name for something which serves more or less
the same purpose.

The new name exists because unique_ptr is not an exact superset of the
auto_ptr syntax. If it were, , we could just fix auto_ptr instead of
deprecating it and introducing a new name.
Just curious, but why the new name?

Read the link. At the top of the read is the reason for deprecating
auto_ptr and substituting in unique_ptr as the replacement. If we could
simply reengineer auto_ptr without breaking existing code we would. But
we can't.
Are there any legal uses of
auto_ptr that won't work exactly the same with unique_ptr? And
if not, why not call it auto_ptr, assuming that that doesn't
break any working code?

From the paper:
However because unique_ptr does not move from lvalues with copy syntax, it is
not a 100% source-compatible drop in replacement for auto_ptr. If it were, we
could just fix auto_ptr instead of deprecating it and introducing a new class
template.


(I use auto_ptr a lot in multithreaded
programs, even when I'm also using the Boehm collector.)

And that is the reason auto_ptr has been deprecated, not removed, from
the standard. We understand that it is heavily used and must remain in
the standard for now. Deprecation doesn't mean non-standard. It merely
means that you are put on notice that it might be removed from a future
standard (say in 2019).

Within that decade ahead of us, I hope that most uses of auto_ptr will
be able to migrate to unique_ptr. But that migration will, in some
cases, require more than just renaming auto_ptr to unique_ptr. The link
points out the breakage under this migration:
However copy semantics is disabled with unique_ptr:

auto_ptr<int> ap1(new int);
auto_ptr<int> ap2 = ap1; // ok, but unsafe implicit move

unique_ptr<int> up1(new int);
unique_ptr<int> up2 = up1; // compile time error: illegal access to
// private copy constructor

If you really want to transfer ownership from the lvalue unique_ptr, you move
from it just as you would any other type:

unique_ptr<int> up1(new int);
unique_ptr<int> up2 = move(up1); // ok, explicit move

In the interim auto_ptr and unique_ptr will coexist in the standard.
unique_ptr will support a superset of the functionality of auto_ptr, but
with slightly different syntax when "copying" (actually moving) from
lvalues.

-Howard
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top