如何用智能指针编写一个类?

Posted

技术标签:

【中文标题】如何用智能指针编写一个类?【英文标题】:How to write a class with smart pointer? 【发布时间】: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。 【参考方案1】:

默认生成的复制 ctors 和赋值运算符使用类成员中提供的那些。

shared_ptrcopy constructor“共享对象的所有权”。

shared_ptrassignment operator 替换和分享。

如果这是您想要的行为,则无需显式声明复制 ctor 和赋值运算符。

【讨论】:

以上是关于如何用智能指针编写一个类?的主要内容,如果未能解决你的问题,请参考以下文章

C++11 智能指针和多态性

如何使用智能指针跟踪类的对象?

第61课 智能指针类模板

当类没有析构函数时,智能指针或作用域指针会删除对象吗

从类成员返回智能指针的正确方法?

2017/03/17学习笔记