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

Should I use smart pointers for my application and library?

本文关键字:智能 指针 我的 应用程序 我应该      更新时间:2023-10-16

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

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

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

  • 学习智能指针是一项宝贵的技能。了解它们是在适当的时候应用它们的基础,而在少数情况下忽略它们
  • 智能指针不仅仅是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的生成完全相同的编译器和模板库,而这可能不是您想要的。因此,对于DLL的API,在使用智能指针之前我会三思而后行。