新对象中的空函数指针实际上不是nullptr

时间:2012-12-12 07:08:02

标签: c++ winapi c++11 nullptr

我正在使用带有Visual Studio 2012的C ++(11)。

我使用自定义包装类创建窗口。

CUIWindow* winA = new CUIWindow ( NULL, TEXT("winAClassName"), TEXT("winACaption"), 200, 300 );

每个窗口都有一系列用于pluggabe事件的“套接字”。

public:
    LPFNCUIWINDOWONCLOSE OnClose;
    LPFNCUIWINDOWONDESTROY OnDestroy;
    LPFNCUIWINDOWONNOTIFY OnNotify;
    LPFNCUIWINDOWONSIZE OnSize;
    LPFNCUIWINDOWONHOTKEY OnHotkey;

我使用以下宏来调用可以在消息循环中分配给我的窗口类的不同套接字:

#define MapEvent(e, fn) \
{ \
    case e: \
        if ( fn != nullptr ) \
            return static_cast<LPARAM>( HANDLE_##e((hWnd), (wParam), (lParam), fn) ); \
}

我的情况如下;

Code with breakpoint

您可以假设pWindow是指向CUIWindow对象的有效指针。

在显示的断点处,一些未初始化的OnXXXX事件被定义为0xCDCDCDCD,并在消息到达时被调用(无论我在创建类之后从未真正明确地设置它们)。这给了我一个0x0BADFOOD异常,因为函数指针是坏的。我会假设if ( fn != nullptr )已经捕获了空函数指针但是现在我不太确定并且我正在请求帮助;

  1. 解释为什么会发生这种情况
  2. 找到阻止这种情况发生的最佳方法,最好不要在构造函数中将所有函数指针显式设置为零,因为有时会有很多很多套接字。

2 个答案:

答案 0 :(得分:2)

CUIWindow类的构造函数中,您需要将这些成员明确设置为nullptr(或NULL0);因为所有这些指针都是原始指针,所以它们不会在0构造函数中自动设置为CUIWindow

CUIWindow ( /* whatever parameters... */)
    : OnClose(nullptr)
    , OnDestroy(nullptr)
    , OnNotify(nullptr)
    , OnSize(nullptr)
    , OnHotkey(nullptr)
{
    // the constructor logic...
}

答案 1 :(得分:1)

未初始化的指针通常不会自动设置为空指针。稍微改变你的班级是一种选择吗?如果是这样,您可以设置所有这些,而无需命名所有这些。

struct CUIWindowEvents
{
    LPFNCUIWINDOWONCLOSE OnClose;
    LPFNCUIWINDOWONDESTROY OnDestroy;
    LPFNCUIWINDOWONNOTIFY OnNotify;
    LPFNCUIWINDOWONSIZE OnSize;
    LPFNCUIWINDOWONHOTKEY OnHotkey;
}

class CUIWindow
{
public:
    CUIWindowEvents Events; // move all events to a simple struct

    CUIWindow() // and in your constructor
        : Events() // initialise Events; this sets all the pointers to null
    { ... }
};