指向unique_ptr的指针-这是一个漏洞吗?

时间:2018-09-25 11:02:10

标签: c++ unique-ptr

规避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;
}

2 个答案:

答案 0 :(得分:9)

在某种意义上,C ++充满了绅士们的同意。换句话说,这种语言使您能够用脚射击自己。

没有什么可以阻止您使用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的析构函数被调用,它将删除指向的对象。