0

F5我有一个Win32程序(桌面应用程序Ctrl + F5),在调试(由 这怎么可能?我正在使用 VS 2010。

编辑:在 Release 构建中,代码可以在没有调试的情况下正常工作,但在调试器中却不行,这与 Debug 构建中发生的情况完全相反。

新编辑:

经过几个小时的研究,我发现问题与使用其 reset() 成员函数初始化静态 std::auto_ptr 对象有关。

记住我上面所说的,窗口标题不会显示在应用程序窗口上,并且这个标题是在 WM_CREATE 消息处理结束时使用 SetWindowText(hwnd, L"Any Title") 设置的。然后我开始在 WM_CREATE 中向后移动这个函数调用,以查看它未能显示窗口标题的确切位置。这发生在静态 std::auto_ptr 对象的第一次初始化之后,如下面的伪代码:

class A{};

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
    static std::auto_ptr<A> a;
    switch ( message )
    {
        case WM_CREATE:
        {
            ...
            a.reset(new A);
            SetWindowText(hwnd, L"Any Title");
            ...
        }
        break;

        case WM_PAINT:

        ...

        break;

        case WM_DESTROY:

        PostQuitMessage(0);
        break;

        default:

        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

这意味着,如果我在变量初始化之前调用 SetWindowText() a,则窗口标题会正确显示,尽管当窗口被绘制时它不会在其客户区显示任何文本。我知道窗户正在涂漆,因为我插入了一个MessageBeep(-1)in WM_PAINT,我可以听到声音。

值得一提的是,WM_PAINT 中打印的所有内容都来自class A堆上分配的对象,其地址封装在std::auto_ptr对象中。

当然,这一切都是在使用Ctrl + F5. 当程序启动时F5一切正常。

新编辑:

我将std::auto_ptr变量更改unique_ptr为无济于事。问题还在继续。

4

1 回答 1

0

这可能是时间问题(可能是任何事情,但无法解释的行为往往是某种竞争条件)。在相关事件/覆盖上添加调试跟踪以查看发生了什么。

于 2012-06-04T06:17:45.793 回答