我是否应该始终使用shared_ptr创建类实例(而不是仅使用new实例)?

时间:2019-05-25 14:20:57

标签: c++ class memory std shared-ptr

如Wiki所示,shared_ptr可以处理堆空间回收问题。 所以,我总是使用shared_ptr创建实例,有问题吗?

我就这样使用它,我不需要delete s,对吧?

s = std::shared_ptr<S>(new S).get();

1 个答案:

答案 0 :(得分:3)

您不应该总是使用shared_ptr,因为存在more types of smart pointer而不是shared_ptr。例如,标准库还提供unique_ptr。您必须评估哪个更适合手头的任务。

但是,一般而言,智能指针是安全处理现代C ++中动态分配的对象的首选方式。根据一般经验,除非遇到无法使用newdelete才能解决的问题,否则请避免使用它们。

顺便说一句,您的示例无法按预期工作。

auto s = std::shared_ptr(new S).get();

这将创建一个悬空指针。对new的调用会动态分配一个S类型的对象。指向该指针的指针将提供给shared_ptr的构造函数,该构造函数现在可以管理对象的生存期。然后,您通过Ss的原始指针的副本分配给get()。在该行的末尾,shared_ptr析构函数释放S,这意味着s所指向的内容都是不确定的。

创建共享指针的正确方法是:

auto s = std::make_shared<S>();