我应该为我的应用程序和库使用智能指针吗?

Should I use smart pointers for my application and library?

关于智能指针的文献太多了,能读多少就读多少。我只想要一个简单的答案。

我已经为我的 3D 渲染器引擎使用了原始指针,现在我必须在渲染器之间共享一些小部件,所以智能指针来了。请指导我是否应该使用智能指针 (std::shared_ptr) 更新整个 software/library?在这种情况下会有什么缺点?我知道优点,只是想知道有什么缺点吗?在从原始指针到智能指针的转换过程中,我应该考虑哪些重要的事情?请具体点?谢谢。

通常,它们是一个有用的工具,但并非所有任务都适合单个工具。也就是说,您应该考虑以下几点:

  • 了解智能指针是一项很有价值的技能。了解它们是在适当的时候应用它们并在少数情况下忽略它们的基础。
  • 智能指针不仅仅是std::shared_ptr。还有 std::unique_ptr,至少还要查看 std::make_sharedstd::make_unique (C++14) 和 std::enable_shared_from_this
  • std::shared_ptr 作为参数传递时,请确保不要添加同步的、多余的引用计数操作,例如,使用 const std::shared_ptr<...>&.
  • 即使标准化的智能指针不是正确的工具,了解它们的工作原理并创建您自己的 RAII 包装器 - 仍然比成熟的、容易出错的原始指针更好。
  • 在连接现有的 C 风格 API 时,您仍然可以经常使用智能指针,并且只在需要时将原始指针传递给那些 API,在智能指针上使用 .get()

关于智能指针的优点还有很多话要说,正如其他人已经说过的那样,我建议在您的应用程序中酌情使用它们。

当谈到图书馆的 API 时,我会说:这取决于。如果您以源代码形式分发库,那么是的,您可以在 API 中使用智能指针,您的用户可能会从中受益。但是,如果您想将您的库作为 DLL 分发,智能指针不是正确的工具。那是因为它们被定义为模板,而模板 类 不能作为 DLL 分发。您的库的用户将被迫使用与您为生成 DLL 所做的完全相同的编译器和模板库——这可能不是您想要的。因此,对于 API 的 DLL,在使用智能指针之前我会三思而后行。