0

据我所知, 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 不再拥有所有权?

4

1 回答 1

3

您的代码没有显示您的想法。

这是简单的未定义行为:auto_pointer这里只是掩盖了您的代码简化为:

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

考虑方法A::display- 它不是虚拟的,因此本质上是一个简单的函数,其名称具有类范围,并通过某种机制接收this指向调用它的对象的隐式指针。

由于函数地址不依赖于对象指针,因此您编译的代码已经发出成功调用函数的代码,只需this==nullptr.

如果您display打印 的值this,或在函数内部使用非静态数据成员A,这应该是显而易见的。


最后,正如 NathanOliver 指出的那样,auto_pointer无论如何,有充分的理由不推荐使用。

于 2016-03-21T14:02:45.550 回答