我的自动指针即使在所有权转移后也能正常工作
My Auto Pointer works even after ownership transfer
据我所知,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
- 它不是虚拟的,因此本质上是一个简单的函数,其名称具有 class 范围,并且通过某种机制接收隐式 this
指针调用它的对象。
由于函数地址不依赖于对象指针,您的编译器已发出成功调用函数的代码,只需 this==nullptr
.
如果您 display
打印 this
的值,或者在函数内部使用 A
的非静态数据成员,这应该是显而易见的。
最后,正如 NathanOliver 指出的那样,auto_pointer
无论如何都会被弃用,而且有充分的理由。
据我所知,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
- 它不是虚拟的,因此本质上是一个简单的函数,其名称具有 class 范围,并且通过某种机制接收隐式 this
指针调用它的对象。
由于函数地址不依赖于对象指针,您的编译器已发出成功调用函数的代码,只需 this==nullptr
.
如果您 display
打印 this
的值,或者在函数内部使用 A
的非静态数据成员,这应该是显而易见的。
最后,正如 NathanOliver 指出的那样,auto_pointer
无论如何都会被弃用,而且有充分的理由。