Вопрос

Если у меня есть 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 будет удален, когда класс выйдет за пределы области видимости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top