Отзывы и auto_ptr - PullRequest
       10

Отзывы и auto_ptr

1 голос
/ 29 апреля 2009

Если у меня есть auto_ptr, я могу передать его для справки? Например:

auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)

А что такое странное поведение копирования auto_ptrs?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2009

Нет, вы не можете, вы должны разыменовать это:

SetOponent( * Class )

Что касается поведения при копировании, я рекомендую вам прочитать хорошую книгу по С ++, такую ​​как «Эффективный С ++» Скотта Мейерса. Поведение auto_ptr при копировании крайне неинтуитивно и, возможно, выходит за рамки SO-ответа. Однако ничто не решалось ...

Когда копируется auto_ptr, право собственности передается от оригинала к копии. Например:

auto_ptr <Foo> p1( new Foo ); 

в этот момент p1 владеет указателем на объект Foo.

auto_ptr <Foo> p2( p1 ); 

После копирования p2 владеет указателем, а p1 изменяется , так что теперь он содержит указатель NULL. Это важно, потому что копирование происходит во многих местах в C ++. Вы никогда не должны, например, передавать auto_ptrs по значению в функции или пытаться сохранить их в стандартных контейнерах библиотеки.

1 голос
/ 29 апреля 2009

Странное поведение при копировании заключается в том, что вы не можете сделать копию и все еще иметь оригинал. Для этого используйте shared_ptr (в boost :: или std :: tr1: :). Это означает, что вы не можете иметь контейнер STL auto_ptrs, между прочим. auto_ptr<> очень полезно, когда у вас будет одна копия объекта с ограниченным временем жизни. Если вы скопируете в другой auto_ptr<>, вы потеряете первое. Если вы пропустите указатели, у вас будет отличный шанс попробовать использовать объект, который уже был удален.

Вы можете вызвать SetOponent(*Class);, если хотите, так как это передаст фактический элемент (вы передаете объекты, а не указатели, ссылкам). Если вы перейдете к указателю, вы можете позвонить с помощью SetOpponent(Class.get()). У вас все еще будет проблема, что MyClass будет удален, когда Class выйдет из области видимости.

...