【发布时间】:2012-02-01 03:00:30
【问题描述】:
我在win32环境中检查了线程过程的堆栈展开。
我的测试代码如下。
class Dummy
{
public:
Dummy() { wcout << L"dummy ctor" << endl; }
~Dummy() { wcout << L"dummy dtor" << endl; }
};
void InnerFunc()
{
Dummy dm;
while(1)
{
char *buf = new char[100000000];
}
}
unsigned WINAPI ThreadFunc(void *arg)
{
Dummy dm;
try
{
InnerFunc();
}
catch(bad_alloc e)
{
wcout << e.what() << endl;
}
_endthreadex(0);
return 0;
}
void OuterFunc()
{
Dummy dm;
HANDLE hModule;
hModule = (HANDLE)_beginthreadex(0, 0, ThreadFunc, 0, 0, 0);
WaitForSingleObject(hModule, INFINITE);
CloseHandle(hModule);
}
int _tmain(int argc, _TCHAR* argv[])
{
OuterFunc();
wcout << e.what() << endl;
return 0;
}
输出结果:
虚拟角色
虚拟角色
虚拟角色
虚拟 dtor
分配不当
虚拟机
如您所知,构造函数和析构函数的输出不是配对的。我认为 _endthreadex() 使线程句柄发出信号并跳过线程的堆栈展开。
当我在没有 _endthreadex() 的情况下再次测试时,我能够得到我期望的结果。
在这种情况下,如果我需要在线程上展开堆栈,我不应该在线程过程中使用 _endthreadex() 吗?
【问题讨论】:
-
如你所知,构造函数和析构函数的输出不是配对的。 不,我们不知道,什么意思?
-
@Als 仔细看看。有三个构造函数调用和两个析构函数调用。
-
@Als 对不起我的英语不好。这句话的意思是构造函数输出的行数与析构函数的不成对。
标签: c++ stack-unwinding