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

文章描述了在使用多线程编译选项(/MT和/MTd)时,通过OCCI从Oracle获取字符串数据导致的程序崩溃问题。原因在于STL字符串在DLL中被不正确地析构。解决方案包括避免直接赋值和使用动态分配的字符串,但后者可能导致内存泄露。最终,作者推荐更改编译选项为多线程DLL(/MD和/MDd)来解决此问题,尽管这可能需要大量代码调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重现场景:

编译方法为【多线程 (/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再载入,否则各种意外)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FBI_willeach

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

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

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

打赏作者

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

抵扣说明:

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

余额充值