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

标签 c++ class memory std shared-ptr

如 wiki 所示,shared_ptr 可以处理堆空间回收问题。 所以,我一直使用shared_ptr来创建实例,有什么问题吗?

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

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

最佳答案

你不应该总是使用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 的构造函数,它现在管理对象的生命周期。然后,您通过 get()S 的原始指针的拷贝分配给 s。在该行的末尾,shared_ptr 析构函数释放了 S,这意味着 s 指向的任何内容都是未定义的。

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

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

关于c++ - 我是否应该始终使用 shared_ptr 来创建类实例(而不是仅仅使用 new)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56305656/

相关文章:

r - 在R中,处理错误:ggplot2不知道如何处理数值类的数据

IOS UIWebView 泄漏

c++ - 如何制作一个实例化类并将它们排序在地址列表中的循环?

c++ - 从派生类构造函数调用基类构造函数

php - 拉维尔 4 : use Facade in custom Class

PHP 类构造函数将 mysql 行作为对象返回

java - 为什么 xmx 和 top 之间的内存使用存在差异?

c++ - 交叉数据结构

C++ 模板类继承[无法转换模板]

c++ - C++ 11中的合取类型特征