2014-07-09 23 views
2

我的目标是为我的新图书馆提供abi兼容性。 我期待使用unique_ptr而不是原始指针。但是恐怕如果我更新标准库,我可能会破坏阿比。这是真的吗?未来的stdlib版本中是否有unique_ptrs的abi稳定性保证?ABI in pimpl idiom with unique_ptr

回答

2

正如您从this blog post可以看到的那样,问题是已知的并且正在解决。就目前情况来看,我担心你能做的最好的事情是与你的编译器供应商一起检查他们是否提供任何保证(例如,不要在次要版本中破坏ABI)。

1

当您使用自定义删除程序时,问题就会出现。 unique_ptr(不像shared_ptr)析构函数需要知道对象的完整类型。因此,你需要在数据成员声明指定缺失者:

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

当实例您被限制使用默认删除器的平普尔。 如果你想定制删除,你需要在decalaration指定它

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

但是,你不能有选择是灵活的,你是否希望的unique_ptr D'TOR调用默认删除或定制删除器。 更灵活的选项是第二个版本,但如果您选择保留默认行为,则必须使用与默认删除等效的特定删除器实例化unique_ptr。

IMO,这使得unique_ptr被用于pimpl习语(并使shared_ptr更好(但平庸)的选择。)