这个代码理论上会有双重免费,但为什么不重复

时间:2016-11-16 12:37:31

标签: c++ smart-pointers

由两个智能指针管理器创建的新Widget,因此会出现双重问题,但执行后不会出现

std::vector<std::shared_ptr<Widget>> processedWidget;
class Widget {
 public:
  void process();
};
void Widget::process()  {
  processedWidget.emplace_back(this); 
}
int main() {
 {
   std::shared_ptr<Widget> w(new Widget);
   w->process();
 }
  return 0;
}

1 个答案:

答案 0 :(得分:1)

双重删除是标准的未定义行为。所以可能会出现工作,同时隐藏灾难。像这样的代码的正确方法是使用std::enable_shared_from_this

std::vector<std::shared_ptr<Widget>> processedWidget;

class Widget : private std::enable_shared_from_this<Widget> {
 public:
  void process();
};

void Widget::process()  {
  processedWidget.emplace_back(shared_from_this()); 
}

int main() {
 {
   std::shared_ptr<Widget> w(new Widget);
   w->process();
 }
  return 0;
}