离奇的std::map、std::set崩溃

一个C++动态库在Windows上运行正常,但在Ubuntu64位虚拟机中,当涉及std::map和std::set时,变量显示为无法访问,调用find()、insert()等接口会崩溃。通过逐步排查,发现是某个包含#pragma pack(x)的头文件导致字节对齐问题。在头文件前后添加#pragma pack(push)和#pragma pack(pop)解决了问题,但在Windows下未出现此问题。

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

现象描述

在一个动态库里使用了std::map和std::set,在windows上用VS2010调试一切正常。但在linux下,用的是Ubuntu64位虚拟机调试,编译链接都OK,但只要调到这个so库里的使用std::map和std::set的地方,这些变量在qt调试里都是**<无法访问>,而且只要调用这些变量的非size()接口,比如find()、insert()等接口都会导致程序崩溃**。
郁闷之间。。。。。。

定位之路

1、和windows调用比较,没发现任何问题
2、修改cmakelists.txt,发现也没有什么可以改的,能改的怎么改结果都一样
3、最笨的办法之一用上,写一段这样的代码:

typedef map<string, void*> STRMAP;
STRMAP sm;
string str = “sdfasf”;
STRMAP::iterator it = sm.find(str);
sm.insert(std::make_pair(“fasf”, &sm));
it = sm.find(str);
放到可执行程序里调用,没有任何问题;放到so里的接口里的开始,按说单步到string str = “sdfasf”;时,sm应该被初始化,变量里能看到sm的值,但实际上sm的值就是<无法访问>,再往下执行find()这一句,就崩溃了。

4、面向互联网大法编程,百度、微软必应(不翻墙,不能狗狗),发现一个帖子,缩小有问题代码的范围,于是
5、最笨的办法之二用上,缩小so代码范围

so之保留一个接口,接口里之

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值