OCCI调用getString()崩溃__acrt_first_block == header

重现场景:

编译方法为【多线程 (/MT)、多线程调试 (/MTd)】

以下代码会崩溃:

string str2;
{
		auto stmt = conn->createStatement(sqlStmt);

		string str = stmt->getString(para_index);
		str2=str;
}//注意:在析构str时崩溃

报错:__acrt_first_block == header

原因是:

stl string在occi dll中已经被析构了一次(原理见__acrt_first_block == header’异常_草琳情的博客-CSDN博客___acrt_first_block == headerc++:动态库接口函数返回stl对象的设计原则塈‘__acrt_first_block == header’异常版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/80522287问题描述最近在写dll动态库时,动态库函数返回的std::string对象在析构时抛出了异常:为简化描述...https://blog.csdn.net/caolinqing1/article/details/103366406

解决方案:

1、网上流传,我不适用:编译方法改为【多线程 DLL (/MD)、多线程调试 DLL (/MDd)】

2、以下代码,亲测,感谢思路(C++调用Oracle中getstring()错误解决方法_鹿人佳的博客-CSDN博客_getoraclestring(1)c++ 利用occi 操作Oracle,读取string类型数据时程序报错,出错代码为:std::string str=pRset->getString(1);解决办法: std::string str=new std::string(pRset->getString(1));https://blog.csdn.net/weixin_39224891/article/details/106697321?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-106697321-blog-4337549.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-106697321-blog-4337549.pc_relevant_recovery_v2&utm_relevant_index=1

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再载入,否则各种意外)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FBI_willeach

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值