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的时候,要特别注意