STL set 容器内存泄漏(WTL)

云满笔记 2013-08-14 07:59:03
为什么下面定义的那个m_aWindows会造成内存泄漏,不明白啊,有哪位大神知道的吗?我试过了,用vector不会提示泄漏,但是用set就会,好像map也会, 这该怎么办啊,是误报还是什么的,求大神路过啊,这真的需要大神来解答呀,我问了好多人,包括工作好几年的他们都不知道呀,我们搞WTL的,对STL知道的少之又少啊

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
HRESULT hRes = ::CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call instead to
// make the EXE free threaded. This means that calls come in on a random RPC thread.
// HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
ATLASSERT(SUCCEEDED(hRes));

// this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
::DefWindowProc(NULL, 0, 0, 0L);

AtlInitCommonControls(ICC_BAR_CLASSES); // add flags to support other controls

hRes = _Module.Init(NULL, hInstance);
ATLASSERT(SUCCEEDED(hRes));

int nRet = Run(lpstrCmdLine, nCmdShow);

_Module.Term();
::CoUninitialize();

std::set<HWND> m_aWindows;
for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++)
{
delete *it;
}
m_aWindows.clear();

#if _DEBUG
_CrtDumpMemoryLeaks();
#endif

return nRet;
}
...全文
253 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
云满笔记 2013-08-16
  • 打赏
  • 举报
回复
引用 8 楼 akirya 的回复:
_CrtDumpMemoryLeaks();调用时间不对,set还没出作用范围内,还能够正常使用,至少应该等set析构之后再调用_CrtDumpMemoryLeaks();
那怎么等到set析构之后呢,我的_CrtDumpMemoryLeaks()是放在main最后的,而我用vector就不会报告泄漏,这啥情况
  • 打赏
  • 举报
回复
_CrtDumpMemoryLeaks();调用时间不对,set还没出作用范围内,还能够正常使用,至少应该等set析构之后再调用_CrtDumpMemoryLeaks();
云满笔记 2013-08-16
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
HWND 咋会用delete删除?
说了那几句可以删掉的,那是我测试用的,可是加了也没用,还是有内存泄漏,那几句可以删掉的
赵4老师 2013-08-15
  • 打赏
  • 举报
回复
无new无delete
  • 打赏
  • 举报
回复
HWND 咋会用delete删除?
大尾巴猫 2013-08-14
  • 打赏
  • 举报
回复
引用 3 楼 wan212000 的回复:
[quote=引用 2 楼 ananluowei 的回复:] [quote=引用 1 楼 ananluowei 的回复:] for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++) { delete *it; } -------------------------- delete后,当前迭代器失效。再返回上去 it++就出问题。
看错了,不是erase迭代器。[/quote] 不是呀,那后面那个for代码是我自己加的,不加的话单独声明也是同样的问题,不信你把如下几行删除,效果是一样的 for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++) { delete *it; } m_aWindows.clear(); [/quote] 所以我说看错了呀。WTL一点都不懂。
云满笔记 2013-08-14
  • 打赏
  • 举报
回复
引用 2 楼 ananluowei 的回复:
[quote=引用 1 楼 ananluowei 的回复:] for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++) { delete *it; } -------------------------- delete后,当前迭代器失效。再返回上去 it++就出问题。
看错了,不是erase迭代器。[/quote] 不是呀,那后面那个for代码是我自己加的,不加的话单独声明也是同样的问题,不信你把如下几行删除,效果是一样的 for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++) { delete *it; } m_aWindows.clear();
大尾巴猫 2013-08-14
  • 打赏
  • 举报
回复
引用 1 楼 ananluowei 的回复:
for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++) { delete *it; } -------------------------- delete后,当前迭代器失效。再返回上去 it++就出问题。
看错了,不是erase迭代器。
大尾巴猫 2013-08-14
  • 打赏
  • 举报
回复
for (std::set<HWND>::iterator it = m_aWindows.begin(); it != m_aWindows.end(); it++) { delete *it; } -------------------------- delete后,当前迭代器失效。再返回上去 it++就出问题。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧