我在几篇文章中读到几乎不应该使用原始指针。相反,它们应该始终包装在智能指针中,无论是作用域指针还是共享指针。
然而,我注意到像 Qt、wxWidgets 这样的框架和像 Boost 这样的库永远不会返回也不期望智能指针,就好像它们根本没有使用它们一样。相反,它们返回或期望原始指针。有什么理由吗?在编写公共 API 时是否应该远离智能指针,为什么?
只是想知道为什么在许多主要项目似乎避免使用智能指针时推荐使用智能指针。
原文由 laurent 发布,翻译遵循 CC BY-SA 4.0 许可协议
除了许多库是在标准智能指针出现之前编写的之外,最大的原因可能是缺乏标准的 C++ 应用程序二进制接口 (ABI)。
如果您正在编写仅包含标头的库,则可以将智能指针和标准容器传递给您的核心内容。它们的源代码在编译时可供您的库使用,因此您仅依赖于它们接口的稳定性,而不是它们的实现。
但由于缺乏标准 ABI,您通常 无法 安全地跨模块边界传递这些对象。 GCC
shared_ptr
可能不同于 MSVCshared_ptr
,后者也可能不同于英特尔shared_ptr
。即使使用 相同 的编译器,也不能保证这些类在版本之间是二进制兼容的。底线是,如果您想分发库的 预构建 版本,您需要一个可以依赖的标准 ABI。 C 没有,但编译器供应商非常擅长针对给定平台的 C 库之间的互操作性——存在事实上的标准。
这种情况对于 C++ 来说不是那么好。各个编译器可以处理它们自己的二进制文件之间的互操作,因此您可以选择为每个受支持的编译器(通常是 GCC 和 MSVC)分发一个版本。但鉴于此,大多数库只导出一个 C 接口——这意味着原始指针。
然而,非库代码通常更喜欢智能指针而不是原始代码。