重现场景:
编译方法为【多线程 (/MT)、多线程调试 (/MTd)】
以下代码会崩溃:
string str2;
{
auto stmt = conn->createStatement(sqlStmt);
string str = stmt->getString(para_index);
str2=str;
}//注意:在析构str时崩溃
报错:__acrt_first_block == header
原因是:
解决方案:
1、网上流传,我不适用:编译方法改为【多线程 DLL (/MD)、多线程调试 DLL (/MDd)】
string str2;
{
string* str = new std::string(stmt->getString(it->para_index));//因为OCCI对于STL的bug,此处不需要delete,在MT编译模式下,由OCCI DLL负责清理stl对象的内存。若此处清理,会崩溃
str2= *str;
}//ok,无内存泄露,顶多多出一个str*的野指针
20230209更正:
上述解决方案2会产生更大的隐患,因为频繁请求,在堆上new出的string一直得不到释放,最终导致堆崩溃,所有要申请堆内存的操作,在一段时间后(堆内存耗尽),将出现不可预料的运行时错误,直接崩掉(飞掉)。
痛定思痛,只能改为MD、MDd编译开关(我的项目下面有好多好多库要重新编,改为shared dll再载入,否则各种意外)