gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:51:32 30 4
gpt4 key购买 nike

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

我使用定制的包装器类创建窗口。

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

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

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 异常,因为函数指针是坏的。我本以为 null 函数指针会被 if ( fn != nullptr ) 捕获,但是现在我不太确定,我正在请求帮助;

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

最佳答案

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

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

关于c++ - 新对象中的空函数指针实际上不是 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13834589/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com