Fir*_*his 2 c++ boost smart-pointers
boost::scoped_ptr文档包含一个称为Handle/Body Idiom的技术示例.它用以下词语描述:
scoped_ptr_example_test.cpp示例程序包含一个头文件scoped_ptr_example.hpp,它使用scoped_ptr <>到不完整类型 来隐藏实现.
但是,与此同时,在文件checked_delete中说明:
一个特别麻烦的情况是智能指针的析构函数,例如 boost :: scoped_ptr :: ~scoped_ptr,用不完整的类型实例化.这通常会导致无声,难以跟踪故障.提供的函数和类模板可用于防止这些问题,因为它们需要完整的类型,否则会导致编译错误.
scoped_ptr确实用于checked_delete其实施.对我来说,看起来两个段落相互矛盾.此外,我无法编译我的代码尝试使用提出的技巧与以下消息:
checked_delete.hpp:32: error: invalid application of 'sizeof' to
incomplete type 'MyClass'
Run Code Online (Sandbox Code Playgroud)
事实上,错误的文件scoped_ptr还是我错过了什么?
它们并不矛盾.因为scoped_ptr是模板,并且因为代码中没有显式实例化,所以每个方法都是按需实例化的.这意味着类型必须在~scoped_ptr<>实例化时完成,在这种情况下,在保持类型完成后在.cpp文件中(查找example::~example(){}接近文件末尾,这~scoped_ptr<>是实例化的位置)
对于用户定义的析构函数来说,这实际上是一个有趣的用例,它看起来与生成的编译器完全相同,但是允许您控制破坏发生的位置/时间以使用一些智能指针启用PIMPL模式.如果没有声明和定义析构函数,那么析构函数将由编译器在需要时隐式定义,并且类型将是不完整的,从而导致UB.
| 归档时间: |
|
| 查看次数: |
893 次 |
| 最近记录: |