前项目发现一个问题,计划永远是一个dynamic_cast当一个异常动态转换,搜索了半天才发现问题竟然是在memset使用,见。但当处于几十万行代码量级中时,就变得不太那么easy定位了。

本文归纳了下使用memset几个须要注意的地方,尽管内容非常easy。但也希望对大家有所帮助。
1. memset是以字节为单位,初始化内存块。
当初始化一个字节单位的数组时,能够用memset把每一个数组单元初始化成不论什么你想要的值,比方,
char data[10];
memset(data, 1, sizeof(data));    // right
memset(data, 0, sizeof(data));    // right
而在初始化其它基础类型时。则须要注意。比方,
int data[10];
memset(data, 0, sizeof(data));    // right
memset(data, -1, sizeof(data));    // right
memset(data, 1, sizeof(data));    // wrong, data[x] would be 0x0101 instead of 1
2. 当结构体类型中包括指针时,在使用memset初始化时须要小心。
比方例如以下代码中,
struct Parameters {int x;int* p_x;
};
Parameters par;
par.p_x = new int[10];
memset(&par, 0, sizeof(par));

当memset初始化时。并不会初始化p_x指向的int数组单元的值。而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。
3. 当结构体或类的本身或其基类中存在虚函数时。也须要慎重使用memset。
这个问题就是在开头项目中发现的问题,例如以下代码中,
class BaseParameters
{
public:virtual void reset() {}
};class MyParameters : public BaseParameters
{
public: int data[3];int buf[3];
};MyParameters my_pars;
memset(&my_pars, 0, sizeof(my_pars));
BaseParameters* pars = &my_pars;//......MyParameters* my = dynamic_cast<MyParameters*>(pars);

程序执行到dynamic_cast时发生异常。

原因事实上也非常easy发现,我们的目的是为了初始化数据结构MyParameters里的data和buf,正常来说须要初始化的内存空间是sizeof(int) * 3 * 2 = 24字节。可是使用memset直接初始化MyParameters类型的数据结构时。sizeof(my_pars)却是28字节,由于为了实现多态机制,C++对有虚函数的对象会包括一个指向虚函数表(V-Table)的指针,当使用memset时,会把该虚函数指针表也被初始化0,和dynamic_cast还可以使用RTTI技术,当用于执行V-Table,可在这个时候,由于V-Table该链接已被摧毁,导致程序异常。

陈词滥调,正确使用memset相关推荐

  1. 老生常谈,正确使用memset

    前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么 ...

  2. 【C++】memset函数

    memset memset是计算机中C/C++语言初始化函数.作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作. 简单来说,就是将某一块内存的全部内容设置为指定的 ...

  3. C语言之memset函数的使用

    转自:老生常谈,正确使用memset 本文归纳了下使用memset几个需要注意的地方,虽然内容很简单,但也希望对大家有所帮助. 1. memset是以字节为单位,初始化内存块. 当初始化一个字节单位的 ...

  4. memset的用法详解

    文章目录 memset简介 需要说明的几个地方 一.不能任意赋值 二.注意所要赋值的数组的元素类型 关于所要赋值的字符数的写法 具体用法实例 总结 memset简介 memset是一个初始化函数,作用 ...

  5. L1-043 阅览室 (20 分)——memset补充

    L1-043 阅览室 (20 分) 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为 ...

  6. 获取令牌密码_如何真正存储用户密码和api令牌(即密码)

    获取令牌密码 A cliché in posts detailing password storage schemes is to finish by telling the syadmins and ...

  7. wenbao与acm技巧(必备知识)

    推荐博客:http://blog.csdn.net/xueerfei008/article/details/19029797    http://blog.csdn.net/xueerfei008/a ...

  8. 【C/C++17】_ooci.h,_ooci.cpp,_mysql.h,_mysql.cpp,_postgresql.h,_postgresql.cpp

    文章目录 1._ooci.h 2._ooci.cpp 3._mysql.h 4._mysql.cpp 5._postgresql.h 6._postgresql.cpp 1._ooci.h //con ...

  9. Unix编程/应用问答中文版(转)

    Unix编程/应用问答中文版 名称 -- Unix编程/应用问答中文版 版本 -- 0.04 ( 2003-10-09 外发版 ) 维护 -- 小四 <scz@nsfocus.com> 主 ...

最新文章

  1. 《信息可视化:交互设计(原书第2版)》——第2章基本概念
  2. iTOP-4412开发板驱动lcd显卡以及linux开机log的修改方法
  3. 2008_10_28_星期二
  4. 串的模式匹配、KMP算法、nextval数组求法
  5. 计算机中丢失vcomp140.dll,Vcomp140.dll文件
  6. spring一站式开发_Spring开发人员知道的一件事
  7. 一名创业者浴火涅磐的自白——对话阿里云MVP孙琦
  8. 【李宏毅2020 ML/DL】P97-98 More about Meta Learning
  9. 数组之间的比较应当用Arrays.equals()
  10. 摩天大楼建造大跃进折射啥危机?
  11. eclipse svn Subversive
  12. 空间数据平台SDP - 医疗药品门店数字化营销
  13. 六月福师计算机应用基础在线作业,19春福师《计算机应用基础》在线作业一答案满分...
  14. POJ 6184 【三元环 +分治】
  15. linux中文件夹的作用
  16. JavaScript实现打字机效果
  17. vue+element_ui纯前端下载csv文件
  18. charles(抓包神器)
  19. SCADS简介及应用
  20. AutoCAD颜色索引表与RGB颜色的对照表

热门文章

  1. 处理火焰的MATLAB程序,炉膛火焰图像预处理的MATLAB实现
  2. 2021高考汕头一中成绩查询,2021年汕头中考高中成绩排名,汕头高中成绩排行榜
  3. 【大学生软件测试基础】历年学生信息查询界面 - 正交表
  4. Java基础入门-详细总结
  5. matlab w 5 0.02 5,连续LTI系统的频域分析
  6. 【智能家居】感应垃圾桶DIY
  7. SpringBoot整合RestHighLevelClient实现查询操作
  8. 火影忍者番外篇-Eova隐藏技能
  9. SkyWalking链路追踪-Agent (代理人)
  10. html checked