使用shared_ptr时需要实现析构函数,复制构造函数,赋值运算符

时间:2017-02-07 09:16:58

标签: c++ c++11 destructor shared-ptr copy-constructor

我正在研究c ++ 11项目。其中我有shared_ptrstd::string数据。

class Base {
 public:
  Base() : Base(string()) {}
  virtual ~Base() = default;
  Base(const string &str) {
    str_ = std::make_shared<string>(str);
  }
 private:
  std::shared_ptr<std::string> str_;
};

我的问题是:我应该在这里实现析构函数以释放str_,复制构造函数和赋值运算符来处理副本? 如果我依赖编译器提供的默认值就足够了吗? 我希望允许在Base b1("string");的堆栈中创建此类的对象,或者在Base *b1 = new Base("string");

的堆中创建此类的对象

1 个答案:

答案 0 :(得分:1)

默认构造函数和赋值运算符(复制和移动)将是&#34;正确&#34;。我放&#34;正确&#34;的原因在引文中我担心你打算从这个Base类派生类(给定虚拟析构函数和名称),如果你写了类似的东西:

Base *p1 = new Derived1("foo", "bar");
Base *p2 = new Derived1("bar", "foo");
*p1 = *p2;   // Will compile, but probably won't do what you want.

具体而言,作业将复制Base指向的对象的p2部分,但不会复制任何Derived1部分。

我要删除构造函数和赋值运算符,要么保护它们。

class Base {
 public:
  Base() : Base(string()) {}
//Either
  Base(const Base& rhs) = delete;
  Base& operator=(const Base& rhs) = delete;
//OR
protected:
  Base(const Base&rhs) = default;
  Base& operator=(const Base& rhs) = default;
  Base(Base&&rhs) = default;
  Base& operator=(Base&& rhs) = default;
public:
//END
  virtual ~Base() = default;
  Base(const string &str) {
    str_ = std::make_shared<string>(str);
  }
 private:
  std::shared_ptr<std::string> str_;
};