basic_string.h不同版本引起的异常崩溃

news2024/10/7 14:28:26

程序运行时报错,查看core文件,发现basic_string.h报错

经过排查发现

编译文件CMakeLists中设置了_GLIBCXX_USE_CXX11_ABI = 0


_GLIBCXX_USE_CXX11_ABI

        是C++中的编译宏, 用来控制string及list使用的版本。 该宏仅在GCC5.1及后续版本中有效。

string及list的新版本符号是std::__cxx11::basic_string 及 std::__cxx11::list。

示例:

#include<string>
void test(std::string &s)
{
    s = "Hello World";
        return;
}

编译使用-D_GLIBCXX_USE_CXX11_ABI=1

test>$ g++ -c -D_GLIBCXX_USE_CXX11_ABI=1 test.c
test>$ nm test.o
0000000000000000 T _Z4testRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
                 U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc
                 test(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)
test>$

编译使用-D_GLIBCXX_USE_CXX11_ABI=0

test>$ g++ -c -D_GLIBCXX_USE_CXX11_ABI=0 test.cc
test>$ nm test.o
0000000000000000 T _Z4testRSs
                 U _ZNSsaSEPKc
				test(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)
test>$

可以看到,-D_GLIBCXX_USE_CXX11_ABI=1 编译后的符号是 std::__cxx11::basic_string,而-D_GLIBCXX_USE_CXX11_ABI=0 编译后的符号是 std::basic_string

string版本不同引发的链接问题

从上节中看到,不同版本的string具有不同的符号。若程序使用了不同版本的库,则会有找不到符号的问题。举例如下:

#include<iostream>
#include<string>

using namespace std;
void a(string s)
{
    cout << s << endl;
    return ;
}

test>$ g++ -c  -D_GLIBCXX_USE_CXX11_ABI=1 a.cc
test>$ nm a.o  | grep " T "
0000000000000000 T _Z1aNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
test>$ c++filt  _Z1aNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
a(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
test>$

主程序:

#include<iostream>
#include<string>

using namespace std;
void a(string s);
int main()
{
    a("12345");
    return 0;
}

test>$ g++ -c -D_GLIBCXX_USE_CXX11_ABI=0 main.cc
test>$ nm main.o | grep _Z1aSs
                 U _Z1aSs
test>$ c++filt  _Z1aSs
a(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)
test>$

可以看到,main.o依赖的是std::basic_string, 而a.o中是std::__cxx11::basic_string,将main.o与a.o链接起来会找不到符号,如下:

test>$ g++ main.o a.o
main.o:在函数‘main’中:
main.cc:(.text+0x32):对‘a(std::string)’未定义的引用
collect2: 错误:ld 返回 1
test>$

项目中是因为编译的动态库是设置的为-D_GLIBCXX_USE_CXX11_ABI=0 ,但是整个运行主程序是-D_GLIBCXX_USE_CXX11_ABI=1,所以出现开头的崩溃

为什么实现两个版本的string?
        在c++11之前的版本,允许string Copy On Write(即string COW)功能,新的C++11版本禁用了此项功能。在新的 C++11中新增了__cxx11这个命名空间以示区别。
        简单来说, COW 功能是在string对象赋值时, 两个string对象共享内存, 只有在其中一个对象被修改时才会申请新的内存。
        关于string COW功能,看如下的代码:

#include<iostream>
#include<string>

using namespace std;
int main()
{
    string s("str");
    string s1 = s;
    
    char *p = const_cast<char *>(s1.data());
    p[2] = '\0';

    cout << s << endl;
    cout << s1 << endl;

    return 0;
}
// 方式一
test>$ g++  -D_GLIBCXX_USE_CXX11_ABI=1  test.cc
test>$ ./a.out
str
st
// 方式二
test>$ g++  -D_GLIBCXX_USE_CXX11_ABI=0  test.cc
test>$ ./a.out
st
st

可以看到, -D_GLIBCXX_USE_CXX11_ABI=0 编译时修改s1.datas也被改变了, 说明ss1共享了内存。 -D_GLIBCXX_USE_CXX11_ABI=1时 s没改变,说明ss1没有共享内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

说说JVM的垃圾回收机制

简介 垃圾回收机制英文为Garbage Collection, 所以我们常常称之为GC。那么为什么我们需要垃圾回收机制呢&#xff1f;如果大家有了解过Java虚拟机运行时区域的组成(JVM运行时存在&#xff0c;本地方法栈&#xff0c;虚拟机方法栈&#xff0c;程序计数器&#xff0c;堆&#xf…

第六节:使用SMB开发WebService

一、概述 webservice在日常开发中是常用的接口形式&#xff0c;SMB在设计之初就将webservice作为重要的代理协议。在组件库中提供了webservice input和webservice output两个组件&#xff0c;分别用于发布接口和调用接口。 二、发布webservice 在csdnProject工程中创建名为c…

C语言易错知识点:scanf函数

scanf在C语言学习中比较常用&#xff0c;但因为其涉及屏幕缓冲区导致有的时候会调入陷阱&#xff0c;下面分享一下常见的需要注意的事项&#xff1a; 1.输入末尾带有回车\n 当我们输入数据后&#xff0c;最后按下回车时&#xff0c;屏幕缓冲区的末尾都会含有这个字符 scanf的…

综合知识篇08-数据库系统考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

【工具推荐】tmux 终端与会话分离神器 | 再也不用担心训练到一半不小心关闭终端导致训练终止了

文章目录 [toc] 0 什么是终端&#xff1f;什么是会话&#xff1f;1 tmux的安装2 tmux的基本操作2.1 启动与退出&#xff08;杀死tmux&#xff09;2.2 分离会话2.3 重接会话2.4 当前已有的会话查看2.5 切换会话 0 什么是终端&#xff1f;什么是会话&#xff1f; tmux是一个 ter…

每个私域运营者都必须掌握的 5 大关键流量运营核心打法!

很多人觉得私域运营比较简单&#xff0c;只是运营的事情&#xff0c;但事实并非如此&#xff0c;私域运营体系非常大&#xff0c;包含了公私域联动、品牌运营、品类战略&#xff0c;它是一个自上而下&#xff0c;由内到外的系统化工程。 很多人天天在想着如何引流拓客&#xf…

人民币跨境支付系统CIPS应用架构设计

人民币跨境支付系统&#xff08;Cross-border Interbank Payment System&#xff0c;简称CIPS&#xff09;作为中国重要的金 融市场基础设施之一&#xff0c;为境内外机构提供人民币跨境支付清算服务及其他相关服务。随着CIPS网络延伸 和规模扩大&#xff0c;为保障公司核心竞争…

每日一题——LeetCode1694.重新格式化电话号码

方法一 模拟&#xff1a; 首先去除number里面的破折号和空格&#xff0c;取出纯数字组成的字符串str。 对于str每三个数分成一组&#xff0c;加一个破折号&#xff0c;当str的长度小于等于4时再分情况讨论&#xff0c;如果等于4就分为22形式&#xff0c;如果小于4&#xff0c…

网络编程--高并发服务器

这里写目录标题 引入场景 多进程并发服务器二级目录二级目录二级目录 多线程并发服务器二级目录二级目录二级目录 多路IO转接服务器设计思路对比引入 select函数简介参数介绍第一个参数第234参数返回值对于第234参数的应用对于最后一个参数总结 附加操作&#xff08;附加四个函…

一招搞定:教你用苹果手机截取滚屏网页

打开Safari浏览器&#xff0c;进入需要截取的网页。 点击屏幕底部的分享按钮&#xff0c;即中间有一个向上箭头的矩形图标。 在弹出的分享菜单中&#xff0c;向左滑动找到“截屏”选项&#xff0c;点击后选择“整页”。 系统会自动将网页保存为PDF文件&#xff0c;并自动打开…

【Redis知识点总结】(五)——Redis实现分布式锁

Redis知识点总结&#xff08;五&#xff09;——Redis实现分布式锁 setnxsetnx expiresetnx expire lua脚本set nx exset nx ex 随机值set nx ex 随机值 lua脚本set ex nx 随机值 lua脚本 锁续期RedissonRedLock 在Redis的众多应用场景中&#xff0c;分布式锁是Redis比…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的Thin…

算法练习:前缀和

目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息&#xff1a; 题目链接&#xff1a; 一维前缀和思路&#xff1a;求前缀和数组&#xff0c;sum dp[r] …

预应力锚杆测力计安装埋设

锚杆测力计用于观测预应力锚杆预应力的形成与变化。当前&#xff0c;预应力锚杆广泛地应用于岩土工程的锚固结构中&#xff0c;通过安装测力计观测锚杆&#xff0c;可以了解锚固力的形成与变化&#xff0c;从而保证监测工程的质量与安全。测力计的安装包括安装测力计和观测锚杆…

【LeetCode热题100】 226. 翻转二叉树(二叉树)

一.题目要求 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;…

餐饮店引流活动方案与最佳营销方案揭秘

想开实体店或正在创业的朋友们&#xff0c;大家好&#xff01;我是一名资深的实体店创业者&#xff0c;本人经营鲜奶吧5年时间&#xff0c;做的是社区店&#xff0c;今天我将分享一些餐饮店引流活动和营销方案的干货&#xff0c;希望能给大家带来一些启发和帮助。 一、引流活动…

【人工智能】英文学习材料02(每日一句)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 目录 Supervised Learning&#xff08;监督学习&#xff09; Unsupervised Learning&#xff08;无监督学习 &#xff09; Semi-supervised Learning&#…

【视频图像取证篇】模糊图像增强技术之色彩空间类滤波器场景应用小结

【视频图像取证篇】模糊图像增强技术之色彩空间类滤波器场景应用小结 模糊图像增强技术之色彩空间HSI滤波器—【蘇小沐】 &#xff08;一&#xff09;色彩空间滤波器 1、HSI滤波器 HSI&#xff08;色调、饱和度和强度&#xff09;滤镜用于将彩色图像转换为 HSI 图像。这意味…

当贝X5 Ultra坚果N1S Ultra哪个好?2024年旗舰投影仪哪家强

家用投影仪在目前年轻用户新家装修的娱乐选择上&#xff0c;有着越来越大的占比。不过虽然投影仪的体验已经逐渐弯道超越传统电视&#xff0c;画面和沉浸感已经抹去了曾经的一些小问题&#xff1b;但仍然有很多雷区和选购的迷惑&#xff0c;以致于在同价位往往陷入不知道哪款更…

展厅设计提高人气的妙招

1、清晰的标识 展厅门口的标识是消费者第一眼能了解到的信息&#xff0c;所以一定要做到简单清楚&#xff0c;在开设专卖店时&#xff0c;就要将标识做到清晰醒目&#xff0c;方便客户寻找。 2、舒适的灯光 灯光是展厅装修中最为重要的一部分&#xff0c;灯光太亮会让人感觉不舒…