我们有一个C++库,我们提供给几个不同的客户端.最近我们改用了在公共接口中使用原始指针而不是使用boost :: sharedptr.正如您可能猜到的那样,这提供了巨大的好处,因为现在客户不再需要担心谁需要删除什么以及何时删除.当我们进行切换时,我认为这是正确的做法,但是让我感到困扰的是我们必须在公共界面中包含来自第三方库的内容 - 如果可以的话,通常会避免这种情况.我认为提升实际上是C++语言的一部分,我们的用例要求客户端代码和库都保存指向对象的指针.然而,最近我们的一位客户问我们是否可以在界面中切换到使用中性智能指针类,因为我们的图书馆实际上是强迫他们使用特定版本的提升 - 这一点我当然理解和欣赏.所以现在我想知道什么是最好的行动方案.我已经考虑了一下,并想知道如何创建一个简单的智能指针类,它只是一个真正的提升智能指针.但是客户端可能会立即将其中一个填充到boost :: sharedptr中,然后我们将深入分析三个 - 这可能是一个问题,或者可能不是.无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见.我已经考虑了一下,并想知道如何创建一个简单的智能指针类,它只是一个真正的提升智能指针.但是客户端可能会立即将其中一个填充到boost :: sharedptr中,然后我们将深入分析三个 - 这可能是一个问题,或者可能不是.无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见.我已经考虑了一下,并想知道如何创建一个简单的智能指针类,它只是一个真正的提升智能指针.但是客户端可能会立即将其中一个填充到boost :: sharedptr中,然后我们将深入分析三个 - 这可能是一个问题,或者可能不是.无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见.
编辑:我原先说的是所有权的转移,但是我应该指定API边界两侧的代码需要保存一个指向该对象的指针.
一种可能的解决方案是将boost :: shared_ptr与您的项目一起发布.由于它全部由标题组成,这将使您的客户不必手动安装boost库.您可以使用bcp来获取特定boost库所需的所有文件,包括库本身.当我在当时为一家公司工作并且需要时,我做到了这一点boost::shared_ptr
,它实际上工作得很好.
shared_ptr <> 是语言的一部分,截至TR1的发布版本.见:(TR1)
如果语义真的是所有权的转移,为什么不使用auto_ptr,因为它是标准的C++?在内部,您仍然可以从auto_ptr构建shared_ptr,然后在需要时拥有共享所有权.
首先,如果您将库分发为源代码而不是编译库,则可以忽略此答案.还有一些特定于Windows的问题可能与其他平台无关.
我个人认为你应该避免在你的库的公共界面中有太多时髦的c ++,因为它会在客户端引起很多问题.
我不确定这对你的特定例子有多适用,但我个人遇到的问题是,当我升级到新版本时,我使用的stl库中的符号与第三方库中的符号冲突.这意味着我们在陌生的地方遇到了崩溃,我不得不做很多伎俩来避免这个问题.最后,由于这个原因,我留下了旧版本的库.
您可能遇到的另一个问题是,不同的c ++编译器可能会以不同的方式编辑相同的符号,这意味着即使它们使用相同的Boost版本,您也可能需要为每个要支持的编译器提供单独的库.查看"Imperfect C++"一书,对此进行讨论.
在当前不同C++编译器和环境的世界中,我认为可悲的事实是,您应该避免在界面中使用除C以外的任何东西,并确保动态链接您的库(以避免链接客户链接库时的冲突,Windows运行时库这可能是一个真正的痛苦).您仍然可以根据需要在库内部使用boost和fancy c ++,因为所有符号都将与dll中的客户环境隔离.
如果您真的想在库的接口中拥有智能指针和其他不错的C++功能,请构建一个便于分发源代码的层.这将确保它始终在客户环境中编译.然后,该接口以巧妙的方式调用暴露的C函数.我不认为在该层中使用boost是一个好主意,因为它会迫使客户采用它,即使他们不想要,但是它很容易替换它或找到另一个解决方案,因为该层作为源分发码.
另一个很好的特性是,如果要将库公开给C/C++之外的其他语言,通常更容易在dll中调用C函数而不是具有奇怪名称错误的c ++函数.
这种方法在很多方面肯定会让你的生活变得更加复杂,但这是一种让人们避免你的库不太可能的方法,因为它不可能成功地与他们自己的代码链接.