起因是:
下面的程序debug版本跑着没问题,但是release版本那条log会反复打印,而且gdb里能看到反复创建LWP线程。
有的时候gdb很卡,表现就是按了ctrl + c后很久才反应,断下来显示提示符。
注释掉创建线程的那句后,会崩在log语句里调用__libc_free() -> get_meta()释放字符串内存时。
int CMyClass::Start() {
m_thread = new std::thread(&CMyClass::ThreadProc, this);
log("started.");
}
这个代码本身是有编译警告的,提示没有return语句。
加了return语句后就好了,去掉return语句后就是上面的现象。
这有点出乎意料,因为一般对没加return语句的预期是这个函数会返回随机的值,而不是出现上述各种奇怪现象。
虽然"main()之外的non-void函数没有return语句"被规定为UB。
看了一下gcc 12.2.0生成的汇编,没有return语句时,就是一个死循环。
--
FROM 221.218.160.*