为啥“delete *this”会编译?

Posted

技术标签:

【中文标题】为啥“delete *this”会编译?【英文标题】:Why does “delete *this” ever compile?为什么“delete *this”会编译? 【发布时间】:2016-04-18 11:25:06 【问题描述】:

我正在从 MFC CDialogEx 派生一个类:

class MyDialog : public CDialogEx

  public:
    virtual void PostNcDestroy();
    …
  …
;

我实现了PostNcDestroyas such:

void MyDialog::PostNcDestroy()

    CDialogEx::PostNcDestroy();
    delete *this; // oops, typo

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢!这就解释了。【参考方案2】:

为什么“delete *this”会编译?

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

struct foo 
    operator int*() 
        return nullptr;
    

    void bar() 
       delete *this; 
    
;

int main() 
    foo f;
    f.bar();

这可以编译,因为foo 可以隐式转换为指针类型。您的班级可能也是如此。

【讨论】:

以上是关于为啥“delete *this”会编译?的主要内容,如果未能解决你的问题,请参考以下文章

为啥VC++ 2010编译器在编译简单代码时会崩溃?

为啥从命令行编译而不是从 IDE 编译时会出现歧义错误?

为啥这个私有模板函数会编译? -> 编译器错误 VS 2009

我不明白为啥会这样编译

为啥编译器在编译的汇编代码中会生成额外的 sqrts

为啥这个 Java 代码会编译?