改进::scoped_ptr文档不一致

boost::scoped_ptr documentation inconsistency?

本文关键字:文档 不一致 ptr scoped 改进      更新时间:2023-10-16

boost::scoped_ptr文档包含一个被称为句柄/正文习语的技术示例。它是用下面的话描述的:

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'

所以,确实,scoped_ptr的文档是错误的还是我只是错过了什么?

它们并不相互矛盾。因为scoped_ptr是一个模板,而且因为代码中没有显式的实例化,所以每个方法都是按需实例化的。这意味着该类型必须在~scoped_ptr<>实例化之前完成,在本例中,在保存类型完成后的.cpp文件中(查找靠近文件末尾的example::~example(){},这是~scoped_ptr<>实例化的地方)

对于用户定义的析构函数来说,这实际上是一个有趣的用例,它看起来与编译器生成的完全相同,但允许您控制,当析构函数恰好使用一些智能指针启用PIMPL模式时,/允许您控制。如果没有声明和定义析构函数,则编译器将在需要的地方隐式定义析构函数,并且类型将是不完整的,从而导致UB。

类模板的成员函数只在它所在的位置实例化使用。在ins中唯一使用boost::scoped_ptr::~scoped_ptr的地方example的析构函数。定义为scoped_ptr_example.cpp,定义后example::implementation完成。这个函数的情况下,boost::checked_delete将不会编译类型不完整;boost::scoped_ptr::~scoped_ptr使用这个,以便的上下文中调用该代码将无法编译类型不完整

(fww:在粉刺习语中使用boost::scoped_ptr有点过头了,而且不是很有用;因为必须提供用户定义的析构函数不管怎么说,它真的买不了什么,只增加了一点点复杂性。)