我的自动指针即使在所有权转让后也能正常工作

My Auto Pointer works even after ownership transfer

本文关键字:常工作 工作 权转让 指针 我的      更新时间:2023-10-16

我所知,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的非静态数据成员,这应该是显而易见的。


最后,正如 NathanOliver 指出的那样,无论如何auto_pointer已被弃用,这是有充分理由的。