考虑以下代码片段。boost::scoped_ptr 的析构函数在 main 函数结束时被调用。析构函数使用 boost::checked_delete 来释放封装的 Widget 指针。
#include <boost/scoped_ptr.hpp>
#include <iostream>
class Widget;
Widget *make_widget();
int main()
{
boost::scoped_ptr<Widget> sp(make_widget());
// std::cout << sizeof(Widget) << std::endl;
}
class Widget
{
public:
Widget() {}
~Widget() { std::cout << "Widget destructor called." << std::endl; }
};
Widget *make_widget()
{
return new Widget;
}
我预计此代码无法编译,因为在scoped_ptr<Widget>
调用析构函数时类 Widget 不完整。sizeof(Widget)
但是,这可以在 g++ 4.8 和 Visual Studio 2010 上干净地编译。请注意主函数中带有表达式的注释语句。如果我取消注释它,它将无法编译,这意味着Widget
此时必须是不完整的。
这种行为的正确解释是什么?
编辑:一些答案(现已删除)指向未定义的行为,但我预计在scoped_ptr
析构函数中使用 checked_delete 会导致编译失败。FWIW,我正在使用 Boost 1.55。