这怎么可能,这是不允许删除的对象与下面的代码私人析构函数? 我已经减少了真正的程序下面的示例,但它仍然编译和作品。
class SomeClass;
int main(int argc, char *argv[])
{
SomeClass* boo = 0; // in real program it will be valid pointer
delete boo; // how it can work?
return -1;
}
class SomeClass
{
private:
~SomeClass() {}; // ! private destructor !
};
您正在试图删除不完整的类类型的对象。 C ++标准说,你会在这种情况下(5.3.5 / 5)得到了一个未定义的行为:
如果要删除的对象在缺失的点具有不完整的类型和完整的类具有一个非平凡的析构函数或解除分配的功能,该行为是未定义。
为了检测这种情况下,你可以使用boost::checked_delete
:
template<typename T>
inline void checked_delete( T* p )
{
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete p;
}
此代码会导致未定义行为(UB)。 它是在UB C ++来delete
具有一个非平凡的析构函数不完全类型的一个对象。 而在你的代码的类型SomeClass
是点不完全delete
,它有一个不平凡的析构函数。 编译器通常发出有关此警告,因为在C ++中正式这并不是一个约束冲突。
所以,严格来说,你的代码不“工作”。 它只是简单地编译和运行时做了定义 。
编译器只是不需要赶上这个错误。 这样做的原因是,这可能是完全正常的,如果你的对象有一个平凡的析构函数。 编译器无法知道什么样的析构函数的这种类型终将方式,所以还不能肯定地说这是否是一个错误或没有。
由于SomeClass
类型调用时未完全申报operator delete
。
删除这样的指针是不确定的行为,但实际上大多数编译器将只释放内存(如果指针非NULL),而不是调用析构函数。
例如,G ++会给你一个关于这个问题的警告:
foo.cpp: In function 'int main(int, char**)':
foo.cpp:6: warning: possible problem detected in invocation of delete operator:
foo.cpp:5: warning: 'boo' has incomplete type
foo.cpp:1: warning: forward declaration of 'struct SomeClass'
foo.cpp:6: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.