使用C 的动态库的C工程crash 但C++ 工程不crash

本文探讨了一个C工程在调用含有C++代码的动态库时出现崩溃的问题,而同样的调用在C++工程中却能正常运行。问题的关键在于C++的动态库中C接口函数内部调用了返回std::string的C++成员函数。这种跨语言调用可能导致未正确处理C++的对象生命周期,从而在C环境中触发异常。
摘要由CSDN通过智能技术生成

用C++ 写了一个动态库,对外的接口函数是C 函数Foo(),Foo() 的实现中调用了用C++ 写的源代码。这个库被两个工程使用,一个C 工程是主要main.c,另一个C++ 工程是main.cpp,编译链接什么的都顺利,但是,执行C 工程的binary 时crash,执行C++工程binary 时不crash并且结果正确。main.c 和 main.cpp 中对动态库接口的使用是完全一样的。动态库工程对外的C 接口文件在最开始和结束的地方是有加下面的宏的:

#ifndef _FOO_H_
#define _FOO_H_

#ifdef __cplusplus
extern "C" {
#endif

// C API goes here

#ifdef __cplusplus
}
#endif

#endif

后来发现,Foo() 函数中调用了一个C++类的成员函数,该函数返回std::string 类型值,即在Foo() 有类似这样的代码

string str = CFooUtil::GetName();
crash在Foo() 函数的最后一句,即return的时候。从callstack看,Foo() 在退出时,要释放局部变量 str,调到了std::string 的析构函数,栈顶几层是这样的:

#0  0x00000036cb4328a5 in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值