简体   繁体   中英

Normal pointer vs Auto pointer (std::auto_ptr)

Code snippet (normal pointer)

int *pi = new int;
int i = 90;
pi = &i;
int k = *pi + 10;
cout<<k<<endl; 
delete pi;

[Output: 100]

Code snippet (auto pointer)

Case 1:

std::auto_ptr<int> pi(new int);
int i = 90;
pi = &i;
int k = *pi + 10; //Throws unhandled exception error at this point while debugging.
cout<<k<<endl;
//delete pi; (It deletes by itself when goes out of scope. So explicit 'delete' call not required)

Case 2:

std::auto_ptr<int> pi(new int);
int i = 90;
*pi = 90;
int k = *pi + 10;
cout<<k<<endl;

[Output: 100]

Can someone please tell why it failed to work for case 1?

You tried to bind auto_pt r to a stack allocated variable.

std::auto_ptr<int> pi(new int);
int i = 90;
pi = &i;

never try to do that - only bind auto_ptr to variables allocated with new . Otherwise auto_ptr will try to delete a stack allocated variable and that's undefined behavior.

Case 1 fails to compile , because you simply can't assign a plain pointer to an auto_ptr . If you want to change the pointer that the auto_ptr is looking after, you can use the reset method:

pi.reset(&i);

Now pi will delete the pointer it was storing earlier.

However, here you'd be storing the address of a stack allocated variable which must not be deleted . The purpose of std::auto_ptr is to manage a dynamically allocated variable.


What you are observing with VC++ 2005 appears to be a bug in the implementation of a feature (ability to assign pointers to std::auto_ptr ) which is apparently unspecified in the standard (whether it should or shouldn't compile).

In the next standard std::auto_ptr will be deprecated anyway, so you might rather experiment with saner smart pointers ( boost::scoped_ptr , boost::shared_ptr ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM