// Destructor. If there is a C object, delete it.
// We don't need to test ptr_ == NULL because C++ does that for us
~scoped_ptr() {
enum { type_must_be_complete = sizeof(C) };
delete ptr_;
}
注意:C是模板参数
我知道我们无法删除空指针,会引发异常。 所以在这种情况下,枚举定义必须做一些事情来防止这种情况。 在生产中,有时我们不想简单地结束程序,因为我们有一个空指针,当指针为空时,我们可能想要查看替代方案。 这段代码几乎用于生产?
谢谢你们。
答案 0 :(得分:17)
它实际上是删除的静态断言。实现想要知道它是否在删除变量之前处理其声明可见的类型,而不是前向声明。
当您询问不完整类型的大小时,您的编译器将发出错误:
struct S;
enum { Size = sizeof(S) };
<强>更新强>
正如您的编译器和Matthieu M.将告诉您的那样 - delete
- 未定义的类型不完整。
答案 1 :(得分:0)
boost checked_deleter似乎更好:
template<class T> struct checked_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const;
};
因为某些编译器可能返回0,而T是未定义的,在这种情况下
enum { type_must_be_complete = sizeof(T) };
是一个有效的静态断言,但checked_deleter将失败。