在C++的union中使用std::string(非POD对象)的陷阱
struct和union的对比
union最开始是C语言中的关键字,在嵌入式中比较常见,由于嵌入式内存比较稀缺,所以常用union用来节约空间,在其他需要节省内存的地方也可以用到这个关键字,写一个简单程序来说明union的用途
struct:
写一个最简单的struct结构体:
struct S
{int i;double d;char c;
};
int main()
{S s;cout<<sizeof s<<endl;
}
最后得到结果为24
int占4位,double占8位,c占1位
由于内存对齐的原因,最后用了3*8 = 24字节
其在内存布局如下:

union:
将这个结构体改为union类型:
union U
{int i;double d;char c;
};
int main()
{U u;cout<<sizeof u<<endl;
}
最后输出结果为8
union的三个变量公用一段内存,所以同时只能存储一个变量
其内存布局如下:

读取值得本质是取到add,按照不同方式进行读取,类似于下面的代码
u.i =(int)(*add);
u.d = (double)(*add);
u.c = (c)(*add);
union中的string
将编译条件改为-std=c++03:
union U
{int i;double d;string s;
};
会发现不支持使用string

因为string不属于POD对象,有构造函数,为了和C语言兼容,所以在旧版中禁止了在union中使用非POD对象(POD全称是PlainOldData,简单理解就是原来在C语言中的原生结构体一类的,不带构造函数等)
不过在后面的C++版本中取消了这个限制
将编译条件改为-std=c++11,编译通过,所以在后面可以在union中使用带构造方法的对象了;
执行如下例子:
#include <iostream>
#include <string>using namespace std;union U
{U(int i){_i = i;}U(string s){_s = s;}string _s;int _i;
};int main()
{U *u =new U("hello");cout<<u->_s<<endl;
}
输出正常结果:

然而这里有一个问题:
这个对象是无法析构的!!!
union中手动添加析构函数及使用析构函数中的陷阱
加上析构函数:
int main()
{U *u =new U("hello");cout<<u->_s<<endl;delete u;
}
直接报错:

这时候,加上析构函数释放内存就可以了:
~U(){_s.~string();}
这样就可以在union中使用string等非POD对象了
但是会出现一个比较大的陷阱,当这个union中存的不为string的时候
int main()
{U *u =new U(12);delete u;
}
这时候调用delete u时,~U()的~string()就会出错(对着一个int类型使用string的析构):
这就需要另外处理了,比如判空
~U(){if(!_s.empty(){_s.~string();}}
相关文章:
在C++的union中使用std::string(非POD对象)的陷阱
struct和union的对比 union最开始是C语言中的关键字,在嵌入式中比较常见,由于嵌入式内存比较稀缺,所以常用union用来节约空间,在其他需要节省内存的地方也可以用到这个关键字,写一个简单程序来说明union的用途 struc…...
Spring Cloud Netflix Eureka的参数调优
下面主要分为Client端和Server端两大类进行简述,Eureka的几个核心参数 客户端参数 Client端的核心参数 参数默认值说明eureka.client.availability-zones告知Client有哪些region以及availability-zones,支持配置修改运行时生效eureka.client.filter-o…...
Wireshark不显示Thrift协议
使用Wireshark对thrift协议进行抓包,但是只显示了传输层的tcp协议: "右键" -> "Decode As" 选择thrift的tcp端口 将“当前”修改为Thrift,然后点击“确定” 设置后,可以发现Wireshark里面显示的协议从Tcp变…...
VMware虚拟机安装openEuler系统(一)(2024)
目录 一、下载ISO镜像 二、开始创建虚拟机 通过实践是学习openEuler开源Linux系统的最佳方式。因此我们首先得搭建一个openEuler实战环境,文章是在Windows系统上使用VMware Workstation虚拟化软件,安装和学习openEuler开源Linux操作系统。 使用虚拟机…...
Rust入门
文章目录 一、HelloWorld二、控制台输入 以最简单的两个Rust程序例子入门Rust。首先需要下载安装Rust,之后在VSCode或Clion中运行Rust需要下载Rust插件 一、HelloWorld fn main(){println!("Hello World!"); }二、控制台输入 use std::io::stdin; fn …...
RabiitMQ延迟队列(死信交换机)
Dead Letter Exchange(死信交换机) 在MQ中,当消息成为死信(Dead message 死掉的信息)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。而 在RabbitMQ中,由…...
浅谈应该遵守的伦敦银交易规则
做伦敦银投资的朋友应遵守伦敦银交易规则,伦敦银交易规则不是指那些伦敦银交易技巧,而是在这个市场中要遵循的一些约定,下面我们就来讨论一下。 风险管理。风险管理即指投资者控制自己一笔乃至整体交易的风险,没有风险管理意识的投…...
安装opencart
一、安装模板 Install SO Emarket Opencart 4 Theme 一:so_emarket_quick2 二:theme package installation 1、installed opencart Default 2、Extensions->Installer->Upload->so_emarket_theme_oc4011_home21_to_home35_v2.0.3->so_theme…...
Qt PCL学习(一):环境搭建
参考 (QT配置pcl)PCL1.12.1QT5.15.2vs2019cmake3.22.4vtk9.1.0visual studio2019Qt5.15.2PCL1.12.1vtk9.1.0cmake3.22.2 本博客用到的所有资源 版本一览:Visual Studio 2019 Qt 5.15.2 PCL 1.12.1 VTK 9.1.0https://pan.baidu.com/s/1xW7xCdR5QzgS1_d1NeIZpQ?pw…...
代码随想录算法训练营第四十二天 | 416. 分割等和子集
题目链接:416. 分割等和子集 文章讲解:代码随想录 416. 分割等和子集讲解 视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集 思路和解法 题目: 给你一个 只包含正整…...
Spring GateWay
概述简介 能干什么 反向代理 鉴权 流量控制 熔断 日志监控 Spring Cloud Gateway 与Zuul的区别 在SpringCloud Finchley正式版之前,Spring Cloud推荐的网关是 Netflix提供的Zuul: 1、Zuul 1.x,是一个基于阻塞Ⅳ/O的APl Gateway 2、Zuul 1.x基于Servl…...
介绍一个关于 JSON 可视化的网站
最近在看到一个比较好玩的网站,可以将 JSON以可视化的方式展现出现,比如存在一下JSON数据: {"id": "f3bbc3bc-9f34-4bf7-8a0f-7e6f6e6fbb9a","isActive": false,"age": 25,"name": "…...
系统架构设计师-22年-上午答案
系统架构设计师-22年-上午答案 更多软考资料 https://ruankao.blog.csdn.net/ 1 ~ 10 1 云计算服务体系结构如下图所示,图中①、②、③分别与 SaaS PaaS Iaas相对应,图中①、②、③应为(1) #mermaid-svg-xqMbIVMC8pWrne2L {font-family:"trebuch…...
2024 年改变行业的人工智能主要趋势
1、导读 当我们迈入 2024 年时,了解人工智能趋势至关重要。它们不仅仅涉及技术进步;还涉及技术进步。它们意味着我们解决问题、做出决策和展望未来的方式发生了转变。本文旨在探索这些变革趋势,并强调人工智能如何不断突破可能性的界限&…...
【Linux Day15 TCP网络通讯】
TCP网络通讯 TCP编程流程 接口介绍 socket()方法是用来创建一个套接字,有了套接字就可以通过网络进行数据的收发。创建套接字时要指定使用的服务类型,使用 TCP 协议选择流式服务(SOCK_STREAM)。 **bind()方法是用来指定套接字使…...
力扣:78. 子集
回溯解法思路: 1.跟前面的组合题目有相同的点,主要区别在于:组合题目是遍历到符合条件的组合时加入li1集合中,子集题目是每递归一次就要把结果加入到li1集合中,并遍历但nums数组的最后。其他点和组合问题一样。 clas…...
(29)数组异或操作
文章目录 每日一言题目解题思路方法一方法二 代码方法一方法二 结语 每日一言 泉涸,鱼相与处于陆,相呴以湿,相濡以沫,不如相忘于江湖。 --庄子内篇大宗师 题目 题目链接:数组异或操作 给你两个整数,n 和…...
mac检查CPU温度和风扇速度软件:Macs Fan Control Pro 1.5.17中文版
Macs Fan Control Pro for Mac是一款专业的电脑风扇控制工具,旨在帮助Mac用户有效控制电脑的风扇速度,提高电脑的运行效率和稳定性。 软件下载:Macs Fan Control Pro 1.5.17中文版 该软件支持多种风扇控制模式和预设方案,用户可以…...
数据结构——单链表详解
目录 前言 一.什么是链表 1.概念 编辑 2.分类 二.单链表的实现(不带头单向不循环链表) 2.1初始化 2.2打印 2.3创建新节点 2.4头插、尾插 2.5头删、尾删 2.6查找 2.7在指定位置之前插入 2.8在指定位置之后插入 2.9删除pos位置 2.10删除pos之后的 2.11销毁链表…...
Unity接入GVoice腾讯实时语音
Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型:独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…...
PHP 8.5 升级生存指南:避免凌晨两点回滚的检查清单
定目标版本,定义内部支持策略在动 CI 或 Composer 之前,先回答一个问题:在你的组织里,这次升级"完成"意味着什么?确定目标和截止日期PHP 分支有两年的活跃支持,然后是两年的安全修复。官方支持表…...
告别Finalshell内存焦虑:实测Xshell 8与MobaXterm,哪款才是低资源占用的SSH神器?
深度评测:Xshell 8与MobaXterm如何解决SSH工具的资源占用难题? 当你的开发工作流被频繁的内存告警打断时,选择一款轻量高效的SSH工具就成为了提升生产力的关键。作为每天需要连接多台服务器的开发者,我深刻理解那种看着任务管理器…...
如何通过离线语音输入提升Android设备的文字录入效率
如何通过离线语音输入提升Android设备的文字录入效率 【免费下载链接】Sayboard An open-source on-device voice IME (keyboard) for Android using the Vosk library. 项目地址: https://gitcode.com/gh_mirrors/sa/Sayboard 在智能手机普及的今天,文字输…...
GitHub Desktop汉化终极指南:如何让英文界面瞬间变成中文
GitHub Desktop汉化终极指南:如何让英文界面瞬间变成中文 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的英文界面而头疼吗…...
Java后端开发——真实面试汇总(持续更新)
一.浙江大学研究院一面(面试Time:1小时30分钟)1. 面试官自我介绍,同时我开始自我介绍2. 平时接触到哪些数据结构?3. ArrayList和LinkedList的主要区别是什么?4. 数组和链表的主要区别是什么?5.…...
能耗效率比拼:百川2-13B量化版在OpenClaw长时间任务中的表现
能耗效率比拼:百川2-13B量化版在OpenClaw长时间任务中的表现 1. 测试背景与目标 最近在探索如何用OpenClaw实现个人工作流的自动化时,遇到一个现实问题:当需要长时间运行自动化任务时,本地设备的能耗和稳定性会成为瓶颈。我决定…...
保姆级教程:用snntorch在MNIST上训练你的第一个脉冲神经网络(附完整代码)
从零开始:用snntorch构建你的第一个脉冲神经网络手记 第一次接触脉冲神经网络(SNN)时,我被它模拟生物神经元放电的特性深深吸引。与传统人工神经网络不同,SNN通过离散的脉冲信号传递信息,更接近人脑的工作机…...
ChatGLM3-6B新手必看:断网可用的本地智能对话解决方案
ChatGLM3-6B新手必看:断网可用的本地智能对话解决方案 1. 引言:为什么你需要一个本地AI助手? 想象一下,你正在处理一份敏感的客户合同,需要AI帮你分析条款;或者你在一个没有稳定网络的环境里,…...
致开发者:别再重复造轮子,这个开源商城系统让你把时间花在刀刃上
作为开发者,你是否厌倦了每次新项目都要从零搭建电商后台?商品、订单、会员、营销……这些基础模块耗费了你多少宝贵的创造力?今天,我们想和你聊聊一个能让你“拿来即用,改也不难”的解决方案——CRMEB开源商城系统。它…...
HunyuanVideo-Foley部署案例:混合精度(FP16/AMP)推理性能实测报告
HunyuanVideo-Foley部署案例:混合精度(FP16/AMP)推理性能实测报告 1. 测试环境与配置 1.1 硬件配置 显卡:RTX 4090D 24GB显存(驱动550.90.07)CPU:10核心处理器内存:120GB DDR4存储…...
