未初始化的类调用函数,没有例外。这里发生了什么?

时间:2011-12-20 00:55:34

标签: c++

这是正常行为吗?这从未发生在我之前。我认为它会导致异常,但为什么不在这里呢?看一看。


CWindowsApplication::MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static CWindowApplication* pApp = NULL;

    if (message == WM_NCCREATE)
    {
    //// retrieve Window instance from window creation data and associate
    //pApp = reinterpret_cast(((LPCREATESTRUCT)lParam)->lpCreateParams); 
    //::SetWindowLong(hWnd, GWL_USERDATA, reinterpret_cast(pApp));

    //pApp = reinterpret_cast(::GetWindowLong(hWnd, GWL_USERDATA));
    }

    pApp->WndProc(hWnd, message, wParam, lParam); // pApp = NULL, but it still works? I expected a exception of some sort. 
}


但是,当我将类更改为其他内容时,我得到了我期待的异常。 这里发生了什么?作为一名热情的程序员,我从来没有遇到过这样的事情。

2 个答案:

答案 0 :(得分:3)

只要WndProc不是虚拟的,从技术上讲,根本不需要取消引用指针以进行调用。这并不是说当你尝试在this内使用this(包括调用带有隐式WndProc的任何虚函数)时它不会崩溃和烧毁,但是非虚拟调用会通过指针的类型,不需要触摸vtable(或任何其他实例成员)。

答案 1 :(得分:2)

您所做的只是调用未定义的行为。这意味着它可能看起来有效,可能会崩溃,或者编译器的任何感觉。