memset 在c++中使用细节注意
C语言,在利用struct进行数据封装时,经常会使用memset(this,0,sizeof(*this))来初始化。而C++中,有时候也会用到struct,在利用memset进行初始化时,非常容易踩坑,有些地方需要注意。
C++利用memset初始化struct注意点
1. memset 是按字节对内存块进行初始化的函数,用来给某一块内存空间进行赋值的;
2. memset 作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;
3. 成员变量可以是简单的内置类型(short、int、long、char、float、double);
4. memset函数不能将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同 !!!!这是撞大运的 ):
memset是逐字节进行初始化,比如对整型数进行初始化,int是32位的共四个字节,每个字节设置为n,则
如果n=1,1为00000001 00000001 00000001 00000001,转为十进制数是1+1*2^8+1*2^16+1*2^24=16843009,而不是1;
如果n=0,0为 00000000 00000000 00000000 00000000,转化为十进制为0;
如果n=-1,-1为 11111111 11111111 11111111 11111111(原码的反码的补码),转化后为-1。
5. 类中含有C++类型的对象(string, list, set, map等)时,千万不要使用memset进行初始化,因为会破坏对象的内存,可用构造函数来实现;
6. 类含有虚函数表时,初始化会破坏虚函数表,后续对虚函数的调用都将出现异常;
7. 类含有指针时,初始化时,并不会初始化指针指向对象的值,而会把该指针设置为0;
---------------------
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
struct Test
{
int a;
string b;
~Test(){cout<<"++++++++++++++++"<<endl;}
}; Test test;
memset(&test,0, sizeof(test));
return -1;
}
~/learing/6-6# ./memset
++++++++++++++++
为毛没有 crash掉啊 !!!!!!!!!!!!!!
程序在第12行创建test 对象,在程序执行完后会自动执行 test的析构。但是,在析构到test的string成员 b 的时候,由于b的内存被memset破坏,因此不能正常析构,从而导致crash。
memset 在c++中使用细节注意的更多相关文章
- 你所不知道的 C# 中的细节
前言 有一个东西叫做鸭子类型,所谓鸭子类型就是,只要一个东西表现得像鸭子那么就能推出这玩意就是鸭子. C# 里面其实也暗藏了很多类似鸭子类型的东西,但是很多开发者并不知道,因此也就没法好好利用这些东西 ...
- Java泛型中的细节
Java泛型中的细节 如果没有泛型 学习Java,必不可少的一个过程就是需要掌握泛型.泛型起源于JDK1.5,为什么我们要使用泛型呢?泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一 ...
- Android学习笔记之布局技巧以及布局中的细节介绍....
PS:休息两天,放一放手上的东西,做做总结... 学习内容: 1.Android中LinearLayout布局技巧... 2.layout中drawable属性的区别... 先简单的介绍一下dra ...
- GA代码中的细节
GA-BLX交叉-Gaussion变异 中的代码细节: 我写了一个GA的代码,在2005测试函数上一直不能得到与实验室其他同学类似的数量级的结果.现在参考其他同学的代码,发现至少有如下问题: 1.在交 ...
- react中这些细节你注意过没有?
react中的一些细节知识点: 1.组件中get的使用(作为类的getter) ES6知识:class类也有自己的getter和setter,写法如下: Class Component { const ...
- Ubuntu安装Chrome过程中的细节
Ubuntu中的默认浏览器是Firefox,但是一直以来都认为Chrome更加优秀.下面记录一下在Ubuntu下安装Chrome的过程,也回顾一下Ubuntu系统中的一些细节. 大多数Linux安装软 ...
- Ajax与json在前后端中的细节解惑
ajax请求JSON Thinkphp中对是否为Ajax的判断,在TP3.2开发手册中有这么一段:“需要注意的是,如果使用的是ThinkAjax或者自己写的Ajax类库的话,需要在表单里面添加一个隐藏 ...
- java中关于try、catch、finally中的细节分析
来源于:http://www.cnblogs.com/aigongsi/archive/2012/04/19/2457735.html 对所有的例子进行总结 1 try.catch.finally语句 ...
- jdbc中的细节
JDBC 架构:JDBC 的 API 支持两层和三层处理模式进行数据库的访问,但是一般的JDBC架构由两层处理模式组成.(1)JDBC API:提供了应用程序对 JDBC 管理器的连接(2)JDBC ...
随机推荐
- 深入理解Redis系列之持久化
redis持久化配置 redis.conf // RDB配置 save 900 1 save 300 10 save 60 10000 // AOF配置 appendonly yes //AOF三种同 ...
- Linux 网卡 bonding配置
网卡 bonding配置 目录 网卡 bonding配置 一.bonding技术 bonding的七种工作模式 总结: 二.Centos7配置bonding 1.关闭和停止NetworkManager ...
- 30天自制OS(linux环境)-day1
30天自制OS(linux环境)--第一天 我是在CentOS的环境上面实现的,使用ubuntu的环境也是类似的 第一步:因为要对二进制文件进行编辑,所以安装二进制编辑器hexedit(当然其他的也可 ...
- spark使用idea向yarn提交报错:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
解决方法: 找到1.19版本放到spark的jars目录下
- JAVA_基础反射机制
Java反射机制概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法. 加 ...
- ASP.NET 上传文件到共享文件夹
创建共享文件夹参考资料:https://www.cnblogs.com/dansediao/p/5712657.html 上传文件代码 web.config <!--上传文件配置,UploadP ...
- java之环境配置
前言:本人环境 Windows10(64位),jdk1.8.131 开发工具: IDEA 第一步: 获取JDK 方法一:推荐官网(此方法需要oracle账号,可以免费注册) 方法二:百度网盘(需要 ...
- 【C++】《Effective C++》第二章
第二章 构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 默认函数 一般情况下,编译器会为类默认合成以下函数:default构造函数.copy构造函数.non-virtual析构函数. ...
- LeetCode-151-中等-翻转字符串里面的单词
问题描述 给定一个字符串,逐个翻转字符串中的每个单词. 说明: 无空格字符构成一个 单词 . 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括. 如果两个单词间有多余的空格,将反转 ...
- PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra
题目分析: 这题我在写的时候在PTA提交能过但是在牛客网就WA了一个点,先写一下思路留个坑 这题的简单来说就是需要找一条最短路->最开心->点最少(平均幸福指数自然就高了),由于本题给出的 ...