我们有一个 C++ 库,提供给多个不同的客户。最近,我们从在公共接口中使用原始指针改为使用 boost::sharedptr。正如您可能猜到的那样,这提供了巨大的好处,因为现在客户不再需要担心谁需要删除什么以及何时删除。当我们进行切换时,我相信这是正确的做法,但令我困扰的是我们必须在我们的公共界面中包含第三方库中的某些内容 - 一般来说,如果可以的话,您会避免这种事情。我认为 boost 现在实际上是 C++ 语言的一部分,并且我们的用例要求客户端代码和库都保存指向对象的指针。然而,最近我们的一位客户问我们是否可以在界面中改用中性智能指针类,因为我们的库本质上是迫使他们使用特定版本的 boost - 我当然理解和欣赏这一点。所以现在我想知道最好的行动方案是什么。我想了一下,想创建一个简单的智能指针类,它只包含一个真正的升压智能指针。但随后客户可能会立即将其中之一填充到他们的 boost::sharedptr 风格中,然后我们将成为三个共享指针深度 - 这可能是一个问题,也可能不是。无论如何,我很想听到社区关于解决这个问题的最佳方法的一些意见。

编辑:我最初说的是所有权转移,但我应该指定 API 边界两侧的代码都需要保存指向对象的指针。

有帮助吗?

解决方案

的shared_ptr <> 语言的一部分,作为TR1的释放。 参考:(TR1)

其他提示

一个可能的解决方案是出货的boost :: shared_ptr的与您的项目。由于这一切由头,这将无需手动安装Boost库释放你的客户。您可以使用 BCP 获得通过所需的所有文件尤其推动图书馆,包括图书馆本身。我这样做,当我在一家公司当时并需要boost::shared_ptr和它实际工作很大。

如果语义是真正的所有权转移的,为什么不因为它是标准的C使用auto_ptr ++?在内部,你仍然可以建立您的shared_ptr从auto_ptr的的,然后有共同的所有权,如果你需要它。

首先,如果你发布你的库源代码,而不是作为一个编译库,你可以忽略这个答案。也有一些窗户可能不相关其他平台特定的问题。

我个人认为你应该避免过于时髦的C ++库中的公共接口,因为它可以在客户端造成了很多问题。

我不知道如何适用,这是你的具体的例子,但我个人碰到,其中来自STL库的符号我在第三方库的使用冲突与那些当我升级到新版本的问题。这意味着,我们在陌生的地方崩溃了,我不得不做大量的技巧来避免这个问题。最后,我留在了老版本,因为这个库的。

您可以运行到的另一个问题是,不同的C ++编译器可以不同裂伤相同的符号,这意味着你可能需要为要支持的,即使它们使用相同的升压版本每个编译器提供一个单独的库。检查出书“不完善C ++”用于在此的讨论。

在不同的C ++编译器和环境的目前世界上我觉得可悲的事实是,你应该避免什么,但下,在你的界面,并确保您动态链接库中(为避免冲突,将您的客户,当链接库中, Windows运行时库都可以在这里真正的痛苦)。只要你想,因为你所有的符号会从你的客户环境中的dll被隔离,您仍然可以使用升压和太多花哨的C ++您的图书馆内。

如果你真的想拥有智能指针,并在你的库接口其他不错的C ++功能,打造您的分发源代码中的便利层。这将确保它总是在客户环境下编译。然后,这个接口巧妙的方法调用你暴露的C函数。我不认为这是使用升压在该层要么因为它会迫使你的客户采用它,即使他们不想要一个好主意,但它很容易取代它,或发现,因为这层的另一种解决方案是分布源代码。

另一个优点是,它通常更容易调用DLL中的C函数比C ++函数用,如果你想你的库暴露在比C / C ++等语言陌生的名字改编。

这方法绝对会让你的生活在许多方面更复杂,但它使得它不太可能是人们避免你的图书馆,因为它只是不可能用自己的代码成功链接的方式。

这是C++。您知道,您可以通过共享指针实现来模板化接口类。

这是我有一段时间提出的一个有趣的问题。您是否强迫用户使用您提供的任何库,或者让他们决定他们的项目中最好的是什么?与往常一样,问题是您向用户提供什么以及您对用户有何要求。

如果您使用原始指针,则允许各种可能性。用户代码可以使用原始指针,将其存储到 std::auto_ptr、shared_ptr(无论是 boost 还是 TR1)或其自制版本的智能指针中。但是,如果用户忘记释放内存,这也可能会给用户带来麻烦,并且如果他们只想为方法调用创建一个临时对象,则需要在他们这边添加更多代码(如果您提供原始指针,他们将必须存储非临时[可能是智能]指针变量中的指针)。

现在,如果您使用智能指针,您就会将解决方案强加给用户。如果他们计划使用自己版本的智能指针(假设您使用 boost::shared_ptr 并且他们想要 std::tr1::shared_ptr),那么如果他们使用您的界面,则不再允许他们使用它。无论您决定使用什么智能指针(除了特殊的 std::auto_ptr 之外),您不仅强制解决方案,而且还强制解决它所存在的问题。

如果您的用户有一个多线程应用程序,并且您的解决方案不是线程安全的,则用户必然会使用不安全的解决方案。另一方面,如果智能指针是线程安全的,但会产生锁定成本,那么即使用户在多线程应用程序中工作,这些成本也会转嫁给用户。如果您编译您的库(不仅仅是头文件库),那么您不仅会强制使用一种类型的智能指针,而且还会强制使用它的特定版本,因为智能指针库中的任何更改都会破坏代码的兼容性。

作为旁注, boost::shared_ptr (boost 1.33+) 是 线程安全 在大多数情况下,它在许多平台上使用无锁实现。无论如何,这应该让您了解应该考虑的事情。

最后,您必须考虑到您不仅绑定用户使用您的智能指针类型,而且还绑定其相同版本。如果您针对特定版本的 boost 编译 lib,则用户将绑定到该特定实现 o

您可以使用升压副本工具建立突发,只有智能指针类的定制版本。 由于智能指针类是只有头库,这将导致几个头,你可以包括与你的库。

引入的boost :: shared_ptr的强制客户使用boost。对某些人来说,这是一个小问题。

这也迫使你的客户端使用相同的编译器13759的lib下,如果你的LIB分布为编译的二进制。或者,如果你的程序分发的源代码,客户端必须坚持以用来编译的lib他们的编译器的自己的选择。这不是一个小问题,以相当规模的任何项目。

使用auto_ptr或粘到一个C接口。迫使C ++库到您的接口总是难看,杀死是跨平台的任何机会,并且使维护恶梦,为客户提供不同的“下游”的配置。

一旦的C ++ 0x为你的客户足够主流,切换到std::shared_ptr

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top