Вопрос
Если у меня есть auto_ptr, я могу передать его в качестве ссылки?Нравится:
auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)
И что такое странное поведение при копировании auto_ptrs?
Решение
Нет, вы не можете, вам пришлось бы разыменовать его:
SetOponent( * Class )
Что касается поведения при копировании, я рекомендую вам прочитать хорошую книгу по C ++, такую как Effective C ++ Скотта Мейерса.Поведение копирования auto_ptr крайне неинтуитивно и, возможно, выходит за рамки ответа SO.Однако никто не рискнул...
Когда auto_ptr копируется, право собственности переходит от оригинала к копии.Например:
auto_ptr <Foo> p1( new Foo );
на данный момент p1 владеет указателем на объект Foo.
auto_ptr <Foo> p2( p1 );
После копирования p2 владеет указателем и p1 изменен так что теперь он содержит нулевой указатель.Это важно, потому что копирование происходит во многих местах C ++.Вы никогда не должны, например, передавать auto_ptrs по значению функциям или пытаться сохранить их в стандартных библиотечных контейнерах.
Другие советы
Странное поведение при копировании заключается в том, что вы не можете сделать копию и при этом сохранить оригинал.Использование shared_ptr
(в усилителе::или std:: tr1::) для этого.Это означает, что у вас не может быть контейнера STL с auto_ptrs
, среди прочего. auto_ptr<>
это очень полезно, когда у вас будет одна копия объекта с ограниченным сроком службы.Если вы скопируете на другой auto_ptr<>
, ты проиграешь первым.Если вы передадите указатели, у вас есть отличный шанс попытаться использовать объект, который уже был удален.
Ты можешь позвонить SetOponent(*Class);
если вам нравится, так как это передаст фактический элемент (вы передаете объекты, а не указатели, ссылкам).Если вы переходите к указателю, вы могли бы вызвать с помощью SetOpponent(Class.get())
.У вас по-прежнему будет проблема с тем, что MyClass будет удален, когда класс выйдет за пределы области видимости.