使用shared_ptr时需要实现析构函数、拷贝构造函数、赋值运算符
Need to implement destructor, copy constructor, assignment operator when using shared_ptr
我正在从事 C++11 项目。在其中我有一个 shared_ptr
保存 std::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");
在堆中创建此 class 的对象
默认构造函数和赋值运算符(复制和移动)将为 "correct"。我把 "correct" 放在引号中的原因是我担心你打算从这个 Base
class 派生 classes(给定虚拟析构函数和名称),如果你这样写:
Base *p1 = new Derived1("foo", "bar");
Base *p2 = new Derived1("bar", "foo");
*p1 = *p2; // Will compile, but probably won't do what you want.
具体来说,赋值将复制p2
指向的对象的Base
部分,但不会复制任何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_;
};
我正在从事 C++11 项目。在其中我有一个 shared_ptr
保存 std::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");
默认构造函数和赋值运算符(复制和移动)将为 "correct"。我把 "correct" 放在引号中的原因是我担心你打算从这个 Base
class 派生 classes(给定虚拟析构函数和名称),如果你这样写:
Base *p1 = new Derived1("foo", "bar");
Base *p2 = new Derived1("bar", "foo");
*p1 = *p2; // Will compile, but probably won't do what you want.
具体来说,赋值将复制p2
指向的对象的Base
部分,但不会复制任何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_;
};