问题记录_初始化带有string的结构体
问题描述:
今天在写代码时遇到一个问题:将定义的一个含有string类型的结构体使用memset进行初始化。发现初始化之后的结构体不可以使用了。
问题解决:(链接)
- memset初始化std::string对象时,按字节顺序将std::string对象所在空间清零,破坏了std::string对象的成员结构,使Myroxy指针资源变为野指针,操作其迭代器会出现不可预知的异常,在存储字符串时可能分配了不必要的内存空间,并且还导致这些内存不能被释放。
(百度百科) - string不能使用baimemset或者memcpy这些低级函数。如果正好工作,那是你比较幸运。c++规定,除了daotrivially copyable类型可以使用memcpy函数外,其他类型是未定义行为。你new完后string的构造函数已经调用完毕,你再memset就破坏了他的内部数据不变式。
- 用好这些概念就需要很多经验,一旦你接触到实际项目,那么这些这些用法才会更加清晰。 不是对所有类不能用,而是只能对于简单的类使用,比如POD(Plain old data),即兼容的C的结构体。c++有构造函数,构造函数用于执行初始化,建立不变式。而析构函数用来销毁对象。memcopy的话,对于没有拷贝构造函数的可以使用(具体还有很多限制,可以搜索trivially copyable type)。 简而言之就是,因为memset这种低级函数绕过了封装,可能会触发意想不到的行为。
(链接) - string类型不能用memset,否则memset会破坏string本身的结构,导致在之后对string对象进行操作时,会引发内存分配的动作, 而这实际上是不应该发生的(应该直接使用string本身的内存而不是新申请内存块),分配的内存没有释放, 这样做的结果是会导致内存泄露。
问题记录_初始化带有string的结构体相关推荐
- 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...
- c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配
#include struct person { char *name; int age; }; int main() { //结构体可以定义在函数内,也可以定义到函数外 //相当于全局变量与局部变量 ...
- c++ 结构体初始化_单片机C语言 - 基于结构体的面向对象编程技巧
单片机C语言 - 基于结构体的面向对象编程技巧 一.面向对象 面向对象是软件开发方法,是相对于面向过程来讲的.通过把数据与方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式 ...
- go结构体初始化_go嵌套匿名结构体的初始化详解
go匿名结构体 嵌套匿名结构体的 示例代码片. type debugConfig struct { MaxQueueDepth int `json:"maxQueueDepth"` ...
- c语言中 定义结构体变量初始化,c++中的结构体:声明 定义 初始化
什么是结构体? 之前的学习中我们知道了数组是一个容器,而且是存放固定大小数据的容器,而且存放的元素的数据类型必须要一致. 比如数据库中有这样的一条记录学号 性别 年龄 成绩 地址应该怎样存放 结构体: ...
- linux c语言结构体初始化,Linux c中 结构体初始化方式
某日在看Linux底层驱动的介绍时,发现在Linux C中结构体的有多种初始化方式,这激起了我的好奇心,亲自实践,今日便来总结一下. 首先定义一个结构体:struct test{ int a; cha ...
- golang 初始化并赋值_golang 结构体初始化时赋值格式介绍
golang在给结构体赋值初始值时,用:分割k,v值 x := ItemLog{ Id: GetUuid(), ItemId: u.Id, UsrId: "123", Name: ...
- java解析c的结构体_解析C语言中结构体struct的对齐问题
首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度.如在32位机器中,char对齐值为1,short为2,int,float为4,do ...
- c++ 结构体初始化_【干货】c语言基础语法——结构体
1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...
最新文章
- .NET Core 配置Configuration杂谈
- Linux自学日记1
- ConfigParser 模块
- Mac 神兵利器(三) 使用Intellij IDEA打造全栈IDE
- ~~染色法判别二分图
- C语言栈的面试题,[面试题]EMC易安信-C语言函数堆栈的思考
- 删除进程 linux,linux批量删除进程
- nmap扫描常用命令
- CDH5 安装需求和相关软件支持的版本信息
- 统计学基础--假设检验
- 记自己开发的淘宝客优惠券
- 4-3 Vue的`:style`用法
- 计算机正在获取ip,电脑频繁显示网络电缆已拔出和正在获取IP怎么办
- Ubuntu18.04配置YCM
- Gradle 下载及代理设置
- SAP SE38代码大小写设定
- 15+ Javascript 中的数组方法
- [转载] 细看名字服务中心
- 解决Win10桌面图标/开始菜单磁贴图标变成白色的问题
- 高中计算机教室标语,高中班级教室励志标语