规避unique_ptr
的简单方法似乎是使用指向unique_ptr
对象的指针。这并不困难。因此,使用unique_ptr有点像绅士的协议,并不是真正的超级强制执行?
#include <iostream>
#include <memory>
using namespace std;
class Box {
public:
int num;
};
void update_box(unique_ptr<Box>* pu);
int main(){
unique_ptr<Box> b{new Box};
unique_ptr<Box>* u = &b;
update_box(u);
cout << b->num << endl; // Outputs 99.
return 0;
}
void update_box(unique_ptr<Box>* pu) {
(*pu)->num = 99;
}
答案 0 :(得分:9)
没有什么可以阻止您使用three = &two;
cout << (*three) << endl;
cout << (*three)->pointer << endl;
的地址。如果您真的感到很讨厌,那么您可以继承std::unique_ptr
并使用包含静态断言的函数重载address-of运算符。
但是即使您这样做了,也可以使用std::unique_ptr
来规避!
答案 1 :(得分:4)
您实际上将您的真实问题发表了评论:
我对
unique_ptr
的理解是,应该使用它来确保您在任何时候只有一个指向对象的指针。
不,这是错误的。您可以轻松地做一个简单的事情:
std::unique_ptr<int> a(new int);
int *b = a.get(); // b points to the same object as a
unique_ptr
尝试的设计,以确保您只能对一个对象拥有一个 unique_ptr
。但是,即使不使用裸指针,它也可以确保这一点。使用裸露的指针,可以轻松避开此设计:
std::unique_ptr<int> a(new int);
std::unique_ptr<int> b(a.get());
此处,b
指向与a
相同的对象,因此该程序具有未定义的行为(因为int
对象将被删除两次)。
unique_ptr
的目的是显示所有权。由于只能有一个unique_ptr
可以指向一个对象(忽略了我之前提到的“ hack”),所以unique_ptr
拥有指向的对象,并且是unique_ptr
的析构函数被调用,它将删除指向的对象。