为什么“删除*this”会编译

Why does “delete *this” ever compile?

本文关键字:编译 this 删除 为什么      更新时间:2023-10-16

我正在从MFC派生一个类CDialogEx

class MyDialog : public CDialogEx
{
  public:
    virtual void PostNcDestroy();
    …
  …
};

我实现了这样的PostNcDestroy

void MyDialog::PostNcDestroy()
{
    CDialogEx::PostNcDestroy();
    delete *this; // oops, typo
}

我很惊讶地看到这段代码编译(使用 VC120 或 Visual Studio 2013(,并且根本没有生成任何警告。谁能说出为什么会这样?

谢谢。

这是一个隐式转换;类CWnd具有operator HWND()转换函数,HWND是指针类型。

删除该HWND是一个错误,但编译器不知道这一点,也无法警告您。

为什么"删除*this"会编译?

可以编写一个简单的 mcve 来重现您询问的行为:

struct foo {
    operator int*() {
        return nullptr;
    }
    void bar() {
       delete *this; 
    }
};
int main() {
    foo f;
    f.bar();
}

这是因为foo可以隐式转换为指针类型。您的班级也可能是这种情况。