【发布时间】:2021-03-18 06:59:48
【问题描述】:
我很难理解原始指针和 unique_ptr 的行为差异。我有 class A 和一个变量 x 和 class B 有一个指向 A 实例的指针:
class A
{
public:
int x;
};
A::A(int y) : x(y)
{
}
class B
{
public:
B(A &);
A *p;
};
B::B(A &a)
{
p = &a;
}
这符合我的预期:
int main()
{
A a(2);
B b(a);
cout << a.x << " " << b.p->x << endl;
a.x = 4;
cout << a.x << " " << b.p->x << endl;
}
给予
2 2
4 4
将原始指针更改为 std::unique_ptr 会得到不同的结果:
class A
{
public:
int x;
};
A::A(int y) : x(y)
{
}
class B
{
public:
B(A &);
std::unique_ptr<A> p;
};
B::B(A &a)
{
p = std::make_unique<A>(a);
}
给予
2 2
4 2
我是否从根本上误解了有关 unique_ptrs 的某些内容?
【问题讨论】:
-
原始指针可以指向它不拥有的东西。 (根据一些现代 C++ 约定,这是首选的习惯用法。)唯一指针拥有它所指向的东西。所以它有自己的副本。
-
p = std::make_unique<A>(a);是new的替代品。而且你不能正确地让unique_ptr指向一个引用,因为它在析构函数中调用delete(除非你用自定义析构函数创建一个,但是你为什么要这样做呢?)。
标签: c++ pointers stl unique-ptr