多线程内存占用越来越大,是否是内存泄漏

linyuexiang6696 2017-05-01 02:43:09
MFC做的多线程发帖程序,随着程序运行,占用的内存不断增大,请问这是什么原因呢?

//.h头文件中
static UINT OnPost(LPVOID lpParam);

//.cpp中
UINT CMyDlg::OnPost(LPVOID lpParam)
{
CMyDlg* dlg=(CMyDlg*)lpParam;
CoInitialize(NULL);
IWinHttpRequestPtr pHttpReq=NULL;

try
{
......
}
catch (...)
{}

CoUninitialize();
return 0;
}
void CMyDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
AfxBeginThread(OnPost,this);
CDialogEx::OnTimer(nIDEvent);
}


代码太长,就不贴出全部代码了,帮忙分析下可能是哪里出问题了啊?
...全文
1709 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
羽毛乱发 2017-05-10
  • 打赏
  • 举报
回复
肯定内存泄漏,这个还要问的啊!!看你没有几行代码,应该在try里面,你自己好好查下,哪里没有释放。
示申○言舌 2017-05-03
  • 打赏
  • 举报
回复
内存越来越大,估计是有泄漏。。申请了内存没有释放。 另外,线程不是越多越好,因为针对每一个CPU,同一时刻只能运行一个线程,之所以看上去是多个线程同时运行,事实上是做了分时处理,只是看上去同时而已。当然,如果你CPU有4核,同一时刻只能有4个线程同时运行。因此,过多的线程只会造成频繁的切换,使得效率更低。正确的方法应该是使用线程池,线程的数量约等于CPU数量*2,实现准备好线程资源,维护一个任务队列,当任务队列为空时,所有线程挂起,不消耗资源,当有任务需要处理时,将任务投递到任务队列,激活一个线程去处理。
阿源是少年 2017-05-03
  • 打赏
  • 举报
回复
引用 14 楼 linyuexiang6696 的回复:
[quote=引用 11 楼 pcradio 的回复:] timer走一次就创建一个线程,检查是不是每个线程都能退出,如果线程数在线性增大,内存会增加的, 如果你每个线程都能正常迅速的退出,泄漏代码必在线程函数内
线程异常退出会导致内存泄漏吗,如果会的话,应该怎么处理啊[/quote] 异常退出就可能导致某处的delele代码得不到执行,检查代码,务必确保任何时候线程都能优雅退出。
linyuexiang6696 2017-05-03
  • 打赏
  • 举报
回复
引用 11 楼 pcradio 的回复:
timer走一次就创建一个线程,检查是不是每个线程都能退出,如果线程数在线性增大,内存会增加的, 如果你每个线程都能正常迅速的退出,泄漏代码必在线程函数内
线程异常退出会导致内存泄漏吗,如果会的话,应该怎么处理啊
赵4老师 2017-05-02
  • 打赏
  • 举报
回复
引用 8 楼 linyuexiang6696 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] 搜“GDI泄露检测”
任务管理器里面的gdi对象是固定不变的[/quote] 嗯,基本可以确定不是GDI句柄泄露问题。 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
linyuexiang6696 2017-05-02
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
搜“GDI泄露检测”
任务管理器里面的gdi对象是固定不变的
linyuexiang6696 2017-05-02
  • 打赏
  • 举报
回复
引用 11 楼 pcradio 的回复:
timer走一次就创建一个线程,检查是不是每个线程都能退出,如果线程数在线性增大,内存会增加的, 如果你每个线程都能正常迅速的退出,泄漏代码必在线程函数内
大哥,能不能把代码发给你帮我看下,愿付报酬,帮帮我吧
linyuexiang6696 2017-05-02
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 linyuexiang6696 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] 搜“GDI泄露检测”
任务管理器里面的gdi对象是固定不变的[/quote] 嗯,基本可以确定不是GDI句柄泄露问题。 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏! [/quote] 看了,变化不大,泄漏的地方应该是在县城函数内吧,问一下,CString变量会导致内存泄漏吗
linyuexiang6696 2017-05-02
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
定时器每次都启动一个线程, 是不是需要限制下线程数量? 另外创建的线程没有管理,到退出时可能不好操作哦
没有限制数量,你是说线程可能不会正常退出吗
赵4老师 2017-05-02
  • 打赏
  • 举报
回复
搜“GDI泄露检测”
赵4老师 2017-05-02
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
zgl7903 2017-05-02
  • 打赏
  • 举报
回复
定时器每次都启动一个线程, 是不是需要限制下线程数量? 另外创建的线程没有管理,到退出时可能不好操作哦
  • 打赏
  • 举报
回复
引用 2 楼 linyuexiang6696 的回复:
[quote=引用 1 楼 yoyo18520 的回复:] 定时器有开吗?一开定时器就开启线程
开了啊[/quote] 尽量用按钮控制线程开关吧,你好好看看定时器的原理吧。 static bool bThread = false; void CMyDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (!bThread) { bThread = true; AfxBeginThread(OnPost,this); } CDialogEx::OnTimer(nIDEvent); }
阿源是少年 2017-05-02
  • 打赏
  • 举报
回复
timer走一次就创建一个线程,检查是不是每个线程都能退出,如果线程数在线性增大,内存会增加的, 如果你每个线程都能正常迅速的退出,泄漏代码必在线程函数内
cutmelon 2017-05-02
  • 打赏
  • 举报
回复
没有其他代码的话,建议楼主把CoInitialize和CoUninitialize做成进程级的控制,msdn里可是说了 However, the first thread in the application that calls CoInitialize with 0 (or CoInitializeEx with COINIT_APARTMENTTHREADED) must be the last thread to call CoUninitialize.
linyuexiang6696 2017-05-01
  • 打赏
  • 举报
回复
引用 1 楼 yoyo18520 的回复:
定时器有开吗?一开定时器就开启线程
开了啊
  • 打赏
  • 举报
回复
定时器有开吗?一开定时器就开启线程

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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