我从MFC CDialogEx
中派生出一个类:
class MyDialog : public CDialogEx
{
public:
virtual void PostNcDestroy();
…
…
};
我实施了PostNcDestroy
as such:
void MyDialog::PostNcDestroy()
{
CDialogEx::PostNcDestroy();
delete *this; // oops, typo
}
我很惊讶地看到此代码编译(使用VC120或Visual Studio 2013),并且根本不会生成任何警告。谁能告诉为什么会这样呢?
谢谢。
答案 0 :(得分:8)
这是一种隐含的转换;类CWnd
具有operator HWND()
转换函数,HWND
是指针类型。
删除HWND
是一个错误,但编译器并不知道并且无法警告您。
答案 1 :(得分:4)
为什么“删除*这个”会编译?
可以编写一个简单的mcve来重现你所询问的行为:
struct foo {
operator int*() {
return nullptr;
}
void bar() {
delete *this;
}
};
int main() {
foo f;
f.bar();
}
这是编译因为foo
可以隐式转换为指针类型。你班上的情况也是如此。