ABI in pimpl成语与unique_ptr

时间:2014-07-09 14:53:46

标签: c++11 unique-ptr abi pimpl-idiom

我的目标是为我的新库提供abi兼容性。 我期待使用unique_ptr而不是原始指针。但我担心如果我更新标准库,我可能会打破abi。这是真的吗?在将来的stdlib版本中,unique_ptrs是否有任何abi-stable保证?

2 个答案:

答案 0 :(得分:2)

正如您从this blog post所看到的那样,问题是已知的并且正在得到解决。就目前情况而言,我担心您能做的最好的事情是与您的编译器供应商核实是否提供任何保证(例如,不要在次要版本中破坏ABI)。

答案 1 :(得分:1)

使用自定义删除程序时问题会增加。 unique_ptr(与shared_ptr不同)析构函数需要知道对象的完整类型。因此,您需要在数据成员声明中指定删除器:

class Foo {
private:
   std::unique_ptr <FooImpl> _pimpl;
};

实例化pimpl时,您将被限制使用默认删除器。 如果需要自定义删除器,则需要在声明中指定它

class Foo {
private:
   std::unique_ptr <FooImpl,  std::function <void (FooImpl*&)> > _pimpl;
};

但是,无论您希望unique_ptr d调用默认删除还是自定义删除,您都无法灵活选择。 更灵活的选项是第二个版本,但如果您选择保留默认行为,则必须使用与默认删除等效的特定删除实例化unique_ptr。

IMO,这是用于pimpl习语的unique_ptr的一个重大缺陷。