Мой Авто Указатель работает даже после передачи права собственности

Насколько я знаю, 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 больше не владеет?

0

Решение

Ваш код не показывает, что вы думаете, что он делает.

Это прямое неопределенное поведение: auto_pointer здесь только скрывается тот факт, что ваш код сводится к:

A *a {nullptr};
a->display();

Рассмотрим метод A::display — она ​​не виртуальная, поэтому, по сути, это простая функция, имя которой имеет область видимости класса и которая через некоторый механизм получает неявный this указатель на объект, для которого он был вызван.

Поскольку адрес функции не зависит от указателя объекта, ваш скомпилированный код выдал код, который успешно вызывает функцию, просто с this==nullptr,

если ты display печатает значение thisили используйте нестатический элемент данных A внутри функции это должно быть очевидно.


Наконец, как отметил Натан Оливер, auto_pointer все равно не рекомендуется и не зря.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]