【发布时间】:2018-09-26 10:29:04
【问题描述】:
我具有从文件中加载和获取图标的功能,如下所示:
std::map<wstring, HICON> m_map_icons;
void WindowSysTray::_loadIconFromFiles()
{
...
for (int i = 0; i < 3; ++i) {
wstring temp = path + trayList[i];
HICON hIcon = NULL;
Gdiplus::Bitmap bitmap(temp.c_str(), false);
bitmap.GetHICON(&hIcon);
pair<wstring, HICON> _pair = make_pair(trayList[i], hIcon);
m_map_icons.insert(_pair);
}
}
HICON WindowSysTray::getIconFromFile(const wchar_t* iconPath)
{
auto iter = m_map_icons.find(wstring(iconPath));
if (iter == m_map_icons.end()) {
return NULL;
}
else {
return iter->second; // ---Issue here---
}
}
...
hIcon = getIconFromFile(L"tray.png");
if (hIcon)
{
TrayIcon.SetIcon(hIcon);
}
...
当我调用getIconFromFile 函数时,它有时会在函数末尾返回值时崩溃:
return iter->second;
我通过调用 _loadIconFromFiles 函数验证并确保我之前加载了 Icon。
有谁知道这个问题的可能根本原因是什么?
【问题讨论】:
-
可能
WindowSysTray的实例无效?发布minimal reproducible example 以展示您如何创建此类的实例。 -
发布的代码似乎没有任何问题。你怎么知道返回值时它会崩溃?
-
我会问调试器。
-
@CuongHuynh 从函数退出时崩溃有时表明堆栈损坏,但在发布的代码中没有证据。
-
@CuongHuynh 你只发布了课程代码——这还不够。我们不知道何时、何地或如何创建
WindowSysTray实例。如果您使用的是无效的WindowSysTray实例,那么在该无效实例中执行的任何操作都会导致未定义的行为。