离奇的std::map、std::set崩溃
现象描述
在一个动态库里使用了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之保留一个接口,接口里之