【发布时间】:2014-07-19 13:47:41
【问题描述】:
考虑以下代码 sn-p。 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 不完整。但是,这可以在 g++ 4.8 和 Visual Studio 2010 上干净地编译。请注意主函数中带有 sizeof(Widget) 表达式的注释语句。如果我取消注释它,它将无法编译,这意味着 Widget 在那时一定是不完整的。
对此行为的正确解释是什么?
编辑:一些答案(现已删除)指向未定义的行为,但我预计在scoped_ptr 的析构函数中使用checked_delete 会导致编译失败。 FWIW,我使用的是 Boost 1.55。
【问题讨论】:
-
Here is the code in action;就像你一样,我希望
check_delete能够捕捉到不完整类型的使用,所以我很惊讶这个编译与sizeof评论。 -
@MatthieuM.:明白了。
-
我认为区别在于你是写
struct SP { ~SP() { depete ptr; } /* ... */ };还是struct SP { ~SP(); /* ... */ };。如果析构函数不是内联的,那么在调用它的时候就不需要知道它,因此也不需要ptr的类型。
标签: c++ boost smart-pointers incomplete-type scoped-ptr