警惕, _endthreadex带来的内存泄漏

unsigned int __stdcall Test(LPVOID lpParam)
{
	CString csUSBID = L"ABC"
	_endthreadex( 0 );
	return 0;
}

 

int main()
{
	HANDLE hThreadUnsafe = NULL;
	hThreadUnsafe = (HANDLE)_beginthreadex(NULL, 0, &Test, this, 0, &m_unsafeThreadID );
	CloseHandle(hThreadUnsafe);
}


很不幸,程序运行以后会提示有3个字节的内存泄漏。

这个内存泄漏是怎么造成的呢?

一般函数中声明的局部变量,会在函数退出,确切的讲,是在return以后调用变量的析构函数来析构的(如果有的话),但是由于线程函数中使用了

_endthreadex提前结束了线程,导致线程函数无法运行到return之后,因此CString的析构函数永远不会被调用,这就造成了内存泄漏。 

当然,简单类型的变量,比如char,int等,没有构造和析构的普通变量是不会造成内存泄漏的。但是如果使用了new,而delete却又在_endthreadex之后,那内存泄漏也是肯定的了。

 

解决方法:

1,如果不需要提前结束线程,不使用_endthreadex,直接使用return, 这样函数退出时会调用在该函数中声明的局部变量的析构函数

2,如果需要提前结束线程,则将使用局部变量的地方加括号,如下代码:

unsigned int __stdcall Test(LPVOID lpParam)
{
	{
		CString csUSBID = L"ABC"
	}
	_endthreadex( 0 );

	return 0;
}


这样csUSBID的生命周期只在这个大括号内,离开大括号的时候就会析构

3,其他情况,ok,谨慎使用,确保在使用这个函数前,声明的变量或者new出来的内存能够被正确释放,特别是在线程函数的子函数中调用_endthreadex的时候,要特别注意



 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值