在WndProc消息(WM_CREATE)中声明和初始化的智能指针对象的寿命

问题描述 投票:0回答:1

如果我像这样在主窗口回调函数中声明和初始化对象:

LRESULT CALLBACK WndProc
(
      HWND hWnd // handle to window of this process
    , UINT msg // message constant
    , WPARAM wParam // holder of message parameters
    , LPARAM lParam // holder of message parameters
)
{
    switch (msg)
    {
        case WM_CREATE:
        {
            std::unique_ptr<Foo> foo = std::unique_ptr<Foo>(new Foo);
        }
        break;
    }
}

foo消息的break之后对象WM_CREATE是否保持初始化?如果不是,那么[[best位置在哪里声明它,以便它的范围不受case范围的限制?

foo对象正在顺便在主窗口中创建控件,所以我认为要求是让它一直存在到运行时结束。

我怀疑它将无法生存。我正在考虑将其声明为全局变量(但出于明显的原因我不喜欢该选项)或声明为回调函数内的静态对象(但在switch之外)。但是也许有更好的选择我看不到,所以我正在寻求您的建议。

谢谢您的帮助!

c++ winapi callback
1个回答
0
投票
WM_CREATE消息中断后,对象foo是否保持初始化?
没有foo}

before中断处超出范围时被销毁。

在哪里声明它的最佳位置,以便它的范围不受大小写范围的限制?

您可以在函数范围内声明它,然后从函数返回时它将被销毁。

{ std::unique_ptr<Foo> foo; switch (msg) { case WM_CREATE: { foo = std::make_unique<Foo>(); } break; } } // foo gets destroyed here

如果即使函数返回后仍需要它继续存在,则需要在函数外部声明它。您可以将其作为LPARAM传递给回调函数。

© www.soinside.com 2019 - 2024. All rights reserved.