为啥“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();
…
…
;
我实现了PostNcDestroy
as 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”会编译?的主要内容,如果未能解决你的问题,请参考以下文章