【问题标题】: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),并且根本不会产生任何警告。谁能说出为什么会这样?

谢谢。

【问题讨论】:

    标签: c++ compilation mfc


    【解决方案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 可以隐式转换为指针类型。您的班级可能也是如此。

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多