我应该为我的应用程序和库使用智能指针吗
Should I use smart pointers for my application and library?
关于智能指针的文献太多了,我已经尽可能多地阅读了。我只想要一个简单的答案。
我已经为我的3D渲染器引擎使用了原始指针,现在我必须在渲染器之间共享一些小部件,所以智能指针来了。请指导我是否应该使用智能指针(std::shared_ptr)更新我的整个软件/库?在这种情况下会有什么缺点?我知道优点,只是想知道有缺点吗?在从原始指针到智能指针的转换过程中,我应该考虑哪些重要的事情?请具体说明?谢谢
通常,它们是一个有用的工具,但并非所有任务都适用于单个工具。也就是说,你应该考虑以下几点:
- 学习智能指针是一项宝贵的技能。了解它们是在适当的时候应用它们的基础,而在少数情况下忽略它们
- 智能指针不仅仅是
std::shared_ptr
。还有std::unique_ptr
,也将std::make_shared
、std::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,在使用智能指针之前我会三思而后行。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制