我的目标是为我的新图书馆提供abi兼容性。 我期待使用unique_ptr而不是原始指针。但是恐怕如果我更新标准库,我可能会破坏阿比。这是真的吗?未来的stdlib版本中是否有unique_ptrs的abi稳定性保证?ABI in pimpl idiom with unique_ptr
2
A
回答
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更好(但平庸)的选择。)
相关问题
- 1. C++ 11 - 可能pimpl-idiom和unique_ptr的困境?
- 2. 使用pimpl-idiom创建库
- 3. 如何为pimpl使用unique_ptr?
- 4. D编程语言中的Pimpl-idiom
- 5. unique_ptr pimpl和不完整类型
- 6. 使用const std :: unique_ptr获取pimpl成语
- 7. 模板中的pimpl-idiom;哪个智能指针?
- 8. 是std :: unique_ptr ABI兼容原始指针?
- 9. C++:unique_ptr with unknow deleter
- 10. C++ 11 initializer list with unique_ptr
- 11. 不能使PIMPL
- 12. pImpl idiom - 将私有类实现放入cpp中的缺点是什么?
- 13. 模板实例化和pimpl成语与unique_ptr
- 14. ”with“macro in C
- 15. Upsert with $ in
- 16. WITH&UNNEST in BigQuery
- 17. C++ pimpl避免void *
- 18. Pimpl with unique_ptr:为什么我必须将接口的构造函数的定义移动到“.cpp”?
- 19. PIMPL
- 20. [] .append(foo)idiom
- 21. mysql select with multiple“in”
- 22. PayPal with Braintree Drop-In
- 23. NDSredicate with IN for NSDate
- 24. mongoDb $ in with aggregate query
- 25. ORMLite with Dagger in Android
- 26. Scala XML with&in CDATA
- 27. HttpWebRequest with https in C#
- 28. select-concat with in-Tag
- 29. SQL SELECT IN with like
- 30. rgb()with ggplot2 in R