确切地说,是否应该在C++库API中公开智能指针?
我使用了相当多的C++库,还没有碰到公开的智能指针。考虑到听到“只使用智能指针”非常常见,开发人员应该在API中公开智能指针吗?
发布于 2019-03-29 21:20:06
这主要有两个方面。存在智能指针来定义某些资源的所有权。因此,第一个问题是,您的API是否应该让外部世界直接面对所有权问题?
这都取决于您的API在做什么。如果您的API正在分配内存,那么将其封装在显式智能指针中是有意义的。如果您的API提供内部使用智能指针来管理资源的对象,则情况就不同了。外部世界不需要看到智能指针本身。
另一个问题是ABI。对于基于DLL/SO的库,将任何标准库类型(或任何不在库控制范围内的类型)放入库公开的API中具有重要意义。这样的库只能由代码使用与构建库完全相同的标准库实现来使用。标准库版本的更改可能会破坏一些东西。大多数标准库实现将在ABI中断发生时宣布,但它仍然代表不完全受您控制的东西。
与此相结合的是,智能指针类型倾向于只使用标头,因此有关该类型的各种特定信息将被编译到DLL/SO以及使用库的程序中。实现上的细微差异可能会破坏一些东西。
有一种观点认为DLL/SO API不应该直接公开任何标准库类型(只有少数例外,比如initializer_list
)。现在,这并不能阻止您编写自己的智能指针类型并在API中使用它们。
发布于 2019-03-29 20:49:22
智能指针是一种明确在使用后清理内存的责任的方法。如果考虑到,例如工厂模式,正确处理创建的对象的所有权是困难的,或者如果不使用智能指针,则需要额外的文档。
因此:是的,智能指针在C++库API中确实有一个有效的位置。
https://softwareengineering.stackexchange.com/questions/389465
复制相似问题