AfxBeginThread和AfxEndThread+内存泄露
ref
http://blog.csdn.net/kut00/article/details/4209680
启动线程:
CWinThread* AfxBeginThread( 线程函数, this );
线程的退出:在刚刚使用的时候,退出线程的方法有问题,导致退出的时候异常。
下面说线程退出的方法:
1. 线程函数返回:线程都在死循环中,当满足一定条件时, return ,也会将线程结束。
2. AfxEndThread:这个函数只能用在线程函数中,当满足一定条件是,调用。
举一个例子:
可以创建一个信号量,用 WaitForSingleObject 函数来检测该信号量的状态。
成员变量 m_hThreadEvent;m_hThreadEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
线程的执行函数:
for ( ; ; )
{
DWORD dwRetVal;
dwRetVal = WaitForSingleObject( m_hThreadEvent, 100 );
if ( dwRetVal == WAIT_TIMEOUT )
{
// TODO:
}
else
{
DWORD dwExitCode; // stop receive text thread.
GetExitCodeThread( m_pThreadRecv->m_hThread, &dwExitCode );
AfxEndThread( dwExitCode, TRUE );
}
}
要结束线程时,使用 SetEvent ,将信号量置为有信号。 该线程是在信号量有信号时,退出。
3. TerminateThread:在 CWinThread 对象中有线程的句柄,可以使用该句柄强行杀死线程。但是不推荐使用这种方式,当可以正常结束的时候,选择前两种方法较好。
http://hi.baidu.com/reversefish/item/37a07243fdf2da95823ae1af
AfxBeginThread引起的内存泄漏
AfxBeginThread引起的内存泄漏(ZZ)
下面的代码,当用AfxBeginThread开始一个线程时,实际上是有内存泄漏的
for (ii = 0 ; ii < 1000 ; ii ++ )
{
CWinThread * pWinThread;
pWinThread = AfxBeginThread(ThreadLBProc, NULL);
::Sleep( 500 );
}
UINT ThreadLBProc(LPVOID pParam)
{
return 0 ;
}
VC输出的典型提示为:
Detected memory leaks!
Dumping objects ->
thrdcore.cpp(166) : {782} client block at 0x00425300, subtype 0, 112 bytes long.
实际上,只要看到是thrdcore.cpp(166) 的内存泄漏,基本就是同一个原因,和上面的代码一样。
解决方法:
step 1)
在线程函数中,记得写AfxEndThread();(与AfxBeginThread对应,其他的开始线程的函数,有相应的函数)
step 2)
用::WaitForSingleObject()确保线程彻底退出
step 2是比较容易忽略的,用sleep函数只能侥幸的保证线程退出,但不能确保。
AfxBeginThread和AfxEndThread+内存泄露的更多相关文章
- java: web应用中不经意的内存泄露
前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- 基于HTML5的WebGL应用内存泄露分析
上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...
- android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!
1.布局优化 首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayo ...
- js内存泄露的几种情况详细探讨
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使 ...
- 使用Xcode7的Instruments检测解决iOS内存泄露
文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...
- 使用Visual Leak Detector for Visual C++ 捕捉内存泄露
什么是内存泄漏? 内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段 ...
- java内存溢出和内存泄露
虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险. 最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————— ...
随机推荐
- ubuntu系统下wireshark普通用户抓包设置
dumpcap需要root权限才能使用的,以普通用户打开Wireshark,Wireshark当然没有权限使用dumpcap进行截取封包. 虽然可以使用 sudo wireshark ...
- Oracle学习第一天---安装和基础入门
国庆七天假,决定静下心来入门Oracle数据库. 环境:Ocacle 11g 软件安装包和安装图解,大家可以在我的百度网盘上下载:链接:http://pan.baidu.com/s/1ntjDEnZ ...
- IOS- 最简单的反向传值- block
block 常用于反向传值 声明 返回值类型 (^block)(参数列表) 调用 闭包的名字=^(参数列表){}: 闭包的名字(): 如: void(^aaaaa)(int num,NSString ...
- 再也不要看到Eclipse万恶的arg0,arg1提示
不知道大家跟我是否一下,遇到arg的提示. @Override public void onDateChanged(DatePicker arg0, int arg1, int arg2, int a ...
- Java实战之03Spring-04Spring的数据库访问
四.Spring的数据库访问 1.DAO模式 /** * 抽取的一个类 * @author zhy * */ public class JdbcDaoSupport { private QueryRu ...
- 暑假集训(3)第四弹 -----Frogger(Poj2253)
题意梗概:青蛙王子最近喜欢上了另一只经常坐在荷叶上的青蛙公主.不过这件事不小心走漏了风声,被某fff团团员知 道了,在青蛙王子准备倾述心意的那一天,fff团团员向湖泊中注入大量的充满诅咒力量的溶液.这 ...
- 7zS.sfx RunProgram with parameters
Config.txt as below: Pay attention to this \" ;!@Install@!UTF-8! RunProgram="setup.exe&qu ...
- POJ 1170 Shopping Offers -- 动态规划(虐心的六重循环啊!!!)
题目地址:http://poj.org/problem?id=1170 Description In a shop each kind of product has a price. For exam ...
- winform水晶报表编译错误,未能加载文件或程序集"file:///C:\Program Files\SAP BusinessObjects\Crystal Reports for .NET Framewor "
未能加载文件或程序集“file:///C:\Program Files\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Commo ...
- Mac 平台下安装 OpenVC
opencv for Mac I 背景 Mac(Ios 9.0), 时间: 2015年11月. 本人也是小白,在网上爬了几天才安装好. II 安装OpenCV for Mac 首先下载op ...