【发布时间】:2017-06-24 11:05:50
【问题描述】:
我正在开发 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"); 在堆中创建此类的对象
【问题讨论】:
-
不,您不需要创建它们。
-
为什么要使用 shared_ptr 来保存字符串?你真的希望这个对象的副本引用相同的字符串吗?如果是,为什么?
-
您可以依赖编译器提供的默认实现,因为默认提供的简单成员复制就足够了。
-
通常在具有虚拟 dtor 的类中,您要删除复制和移动构造函数和赋值运算符,或者至少将它们设为私有/受保护。
-
@RuLoViC 没有。如果您希望它是线程安全的,则需要保存一个指向同时包含字符串和互斥体的结构的共享指针。您还需要在访问字符串时保持互斥锁锁定。要进一步评论,我需要知道用例。您可能会受益于在 codereview.stackexchange.com/questions/tagged/c%2b%2b 上发布您的设计并解释用例。
标签: c++ c++11 destructor shared-ptr copy-constructor