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

时间:2015-06-28 05:14:06

标签: c++ pointers c++11 shared-ptr smart-pointers

有很多关于智能指针的文献,我尽可能多地阅读。我只想要一个简单的答案。

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

2 个答案:

答案 0 :(得分:3)

通常,它们是一个有用的工具,但并非所有任务都适用于单个工具。也就是说,这里有一些你应该考虑的事情:

  • 学习智能指针是一项宝贵的技能。了解它们是适当时应用它们的基础,并在少数情况下忽略它们。
  • 智能指针不仅仅是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时,您仍然可以经常使用智能指针,只需在智能指针上使用.get()将原始指针传递给需要的API。

答案 1 :(得分:1)

很多关于智能指针的优点的说法,正如其他人已经说过的,我会建议在适当的时候在你的应用程序中使用它们。

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