Обычный указатель против автоматического указателя (std :: auto_ptr) - PullRequest
0 голосов
/ 23 апреля 2010

Фрагмент кода (обычный указатель)

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

[Output: 100]

Фрагмент кода (автоматический указатель)

Дело 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)

Дело 2:

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

[Output: 100]

Может кто-нибудь сказать, почему это не сработало в случае 1?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Случай 1 не компилируется , потому что вы просто не можете назначить простой указатель на auto_ptr. Если вы хотите изменить указатель, за которым следит auto_ptr, вы можете использовать метод сброса:

pi.reset(&i);

Теперь pi удалит указатель, который хранился ранее.

Однако здесь вы будете хранить адрес переменной, выделенной в стеке, которую нельзя удалять . Цель std::auto_ptr - управлять динамически размещаемой переменной.


То, что вы наблюдаете в VC ++ 2005, похоже, является ошибкой в ​​реализации функции (возможность назначать указатели на std::auto_ptr), которая явно не указана в стандарте (должна ли она компилироваться или не должна).

В следующем стандарте std::auto_ptr в любом случае будет устаревшим, так что вы можете поэкспериментировать с более разумными умными указателями (boost::scoped_ptr, boost::shared_ptr).

2 голосов
/ 23 апреля 2010

Вы пытались привязать auto_pt r к выделенной в стеке переменной.

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

никогда не пытайтесь это сделать - только привязывайте auto_ptr к переменным, выделенным с помощью new.В противном случае auto_ptr попытается delete переменная, выделенная стеком, и это неопределенное поведение.

...