Насколько я знаю, auto_ptr работает над концепцией передачи права собственности. Кроме того, как только автоматический указатель передает свое владение другому автоматическому указателю, он больше не сможет ссылаться на объект, на который он указывает. Однако, это не тот случай, который я обнаружил, как показано в приведенной ниже программе. Я что-то пропустил? Пожалуйста помоги.
#include <iostream>
#include <string>
#include <memory>
class A
{
public:
void display(){
std::cout << "Inside class A" << std::endl;
}
};
int main()
{
std::auto_ptr<A> p1(new A());
std::auto_ptr<A> p2;
std::cout << p1.get() << std::endl;
p2=p1;
std::cout << p2.get() << std::endl;
p2->display();
std::cout <<p1.get()<< std::endl; //Address of shows 0 as expected
p1->display(); //L1
std::auto_ptr<A> p3 = p1; //L2
std::cout << p3.get() << std::endl; //Address shows 0 as expected
p3->display();
return 0;
}
Output:
0x45a0620
0x45a0620
Inside class A
0
Inside class A
0
Inside class A
Строка L1: Как это работает, так как p1 больше не имеет владельца?
Строка L2: Как это работает, так как p1 больше не владеет?
Ваш код не показывает, что вы думаете, что он делает.
Это прямое неопределенное поведение: auto_pointer
здесь только скрывается тот факт, что ваш код сводится к:
A *a {nullptr};
a->display();
Рассмотрим метод A::display
— она не виртуальная, поэтому, по сути, это простая функция, имя которой имеет область видимости класса и которая через некоторый механизм получает неявный this
указатель на объект, для которого он был вызван.
Поскольку адрес функции не зависит от указателя объекта, ваш скомпилированный код выдал код, который успешно вызывает функцию, просто с this==nullptr
,
если ты display
печатает значение this
или используйте нестатический элемент данных A
внутри функции это должно быть очевидно.
Наконец, как отметил Натан Оливер, auto_pointer
все равно не рекомендуется и не зря.
Других решений пока нет …