【问题标题】:How do I initialize a static std::map?如何初始化静态 std::map?
【发布时间】:2009-07-27 13:30:32
【问题描述】:

我已经创建了一个只显示消息的窗口类,并且我正在尝试将 HWND 映射回具有这些句柄的对象。我正在尝试使用属于该类的私有静态 std::map<HWND, CMyClass*> 来做到这一点,如下所示:

MyClass.h:

class CMyClass
{
    ...

private:
    HWND        m_hWnd;
    HINSTANCE   m_hInstance;
    LPCSTR      m_szClassName;

    static std::map<HWND, CMyClass*> s_mapHandles;

    ...
};

MyClass.cpp:

std::map<HWND, CMyClass*> CMyClass::s_mapHandles;

但是当我尝试添加到地图时,程序崩溃了。我尝试了三种不同的形式,它们都给出了相同的错误:

...
m_hWnd = ::CreateWindowEx(0, m_szClassName, "Message Window", 0, 0, 0, 0, 0, HWND_MESSAGE, 0, m_hInstance, 0);
s_mapHandles.insert(pair<HWND, CMyClass*>(m_hWnd, this));

...
s_mapHandles.insert(s_mapHandles.end(), pair<HWND, CMyClass*>(m_hWnd, this));

甚至

...
s_mapHandles[m_hWnd] = this;

在每种情况下,调用_Root() 都会发生崩溃,该调用试图返回_Parent(_Myhead)_Parent(_Myhead) 返回 (_Nodepref)(*_Myhead)._Parent 失败,因为 _Myhead 为空。

如何初始化地图,使其头部不为空,并且我可以在不崩溃的情况下插入内容?抱歉,如果我解释得不好 - 我是 C++ 新手。

【问题讨论】:

  • 你能把代码贴在你调用插入的地方吗?前面还有几行?
  • 从你的代码来看,地图没有被声明为静态的。
  • @Neil:好点子。它在原版中 - 已修复。

标签: c++ dll stl stdmap


【解决方案1】:

你是从另一个静态初始化对象的构造函数中使用它吗?

阅读 C++ FAQ Lite - 10.12 What's the "static initialization order fiasco"?

【讨论】:

  • 我不这么认为,但这是一个有趣(也很可怕)的问题,我会注意的。感谢您指出!
【解决方案2】:

你根本不需要初始化它,它应该默认初始化。

【讨论】:

    【解决方案3】:

    只是出于好奇。窗口句柄不为空吗?因为如果窗口句柄返回为 null 则插入将失败。

    【讨论】:

    • 只有第二次(因为这将是重复的) - 这不会导致他所问的问题。
    • 无论窗口句柄是否为空都会出现问题。
    【解决方案4】:

    原来的问题可能已经解决了,但我碰巧遇到了类似的问题(没有静态部分)。我曾经将地图放在函数内部,然后将其移动到类变量中。插入地图时我也遇到了崩溃。事实证明,我需要删除所有已编译的对象并从头开始编译。然后一切都按预期工作。

    【讨论】:

      【解决方案5】:

      我的 C++ 有点生锈,但我认为没有任何理由在 .cpp 文件中包含该行。事实上,由于它不是静态成员,我不确定会导致什么样的行为。但就像我说的,我生疏了——我可能会遗漏一些东西。

      【讨论】:

      • 抱歉,忘记在此处输入“静态”。在我们的代码中,它是静态的。
      【解决方案6】:

      这可能在此期间已解决,但仅供参考:这是问题背后实际问题的另一种解决方案:您可以将自定义数据存储在任何窗口的 GWL_USERDATA 字段中(我相信使用 ::SetWindowLong API如果我没记错的话会起作用)。如果您将 CMyClass 指针放在那里而不是通过映射将其与 HWND 关联,那么您根本不需要映射,并且它更有效,因为您需要做的就是对指针进行类型转换而不是昂贵的地图查找。

      【讨论】:

        猜你喜欢
        • 2010-09-13
        • 2015-05-08
        • 2017-12-31
        • 2012-02-01
        • 2014-10-14
        • 2016-07-30
        • 1970-01-01
        • 2016-10-05
        • 2019-04-15
        相关资源
        最近更新 更多