【发布时间】:2014-04-17 02:31:38
【问题描述】:
假设我有一堂课:
class State {
std::shared_ptr<Graph> _graph;
public:
State():_graph(new Graph){}
};
关于rule of three,显然不需要在析构函数中释放_graph,因为它是一个智能指针。问题是,我需要为它写拷贝构造函数和赋值运算符吗?
考虑以下:
State s1;
State s2 = s1;
第二行会发生什么?
看起来会是s2._graph = s1._graph;,指针共享,所以我们安全吗?
【问题讨论】:
-
就你所展示的,你很好。您可以将这些方法显式声明为 '= default' 以表明您是故意这样做的。
-
这取决于您所说的“安全”。关于内存泄漏、双重删除等,是的,你是安全的。如果要在多线程环境中使用此类,您现在已经介绍了微妙的隐藏共享、未锁定且不安全的跨线程状态共享的可能性。
-
阅读rule of Zero。
标签: c++ c++11 shared-ptr smart-pointers