繁体   English   中英

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

[英]Should I use smart pointers for my application and library?

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

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

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

  • 学习智能指针是一项宝贵的技能。 了解它们是在适当的时候应用它们的基础,而在少数情况下则忽略它们。
  • 智能指针不仅仅是std::shared_ptr 还有std::unique_ptr ,也std::make_unique研究std::make_sharedstd::make_unique (C ++ 14)和std::enable_shared_from_this
  • 在将std::shared_ptr作为参数传递时,请确保不要添加同步的多余引用计数操作,例如,使用const std::shared_ptr<...>&
  • 即使标准的智能指针不是正确的工具,也要知道它们的工作方式并创建自己的RAII包装器-仍然比成熟的,容易出错的原始指针要好。
  • 在连接现有的C样式API时,您仍然经常可以使用智能指针,并且仅在需要时使用智能指针上的.get()将原始指针传递到这些API。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM