1.问题描述

实际项目中,定义一个如下的基类和子类,均包含有虚函数。

//基类

class OriginalTask {

public:

OriginalTask() {};

virtual ~OriginalTask() {};

virtual bool readFromFileInit(TiXmlElement* const task_element) = 0;

virtual string createResultFile(TiXmlElement* const task_element, Task* task){}

};

//子类

class DICCUOriginalTask : public OriginalTask {

public:

bool readFromFileInit(TiXmlElement* const task_element){};

string createResultFile(TiXmlElement* const task_element, Task* task){};

DICCUOriginalTask(){};

~DICCUOriginalTask(){};

public:

uint8 algorithm;

uint8 encodeType;

uint32 cipher_num;

uint32 cipher_len;

};

使用new定义一个DICCUOriginalTask的对象指针之后,使用memset将对象实体置为0之后,在使用delete析构该对象,就会出现莫名其妙的段错误。

DICCUOriginalTask* dicOriTask=new DICCUOriginalTask;

memset(dicOriTask,0,sizeof(DICCUOriginalTask));

//对dicOriTask的各种处理均未出错

delete dicOriTask;//Segmentation fault (core dumped)

2.问题分析

上面的错误,让我百思不得其解。段错误是指访问的内存超出了系统给这个程序所设定的内存空间,考虑到导致段错误的常见两种情况是:

(1)访问系统保护的内存地址,如向地址0写入数据。

(2)内存越界,如数组越界。

当然还有其他的情况,如访问了不存在的内存地址。总而言之,段错误的出现是因为对内存空间的不正确操作。

基于对段错误的理解,本以为是对 dicOriTask处理过程中有不正确的操作,但是几经周折排查后并未发现错误,莫名其妙,原来问题很简单。是memset对类对象的误用。

memset一般用于C语言中对结构体的对象进行置空操作,我却沿用到了C++的类对象。如果类包含有虚函数,那么类对象就会包含有虚函数表指针。如果此时对类对象使用memset置空,那么虚函数表指针也会被置空,当使用delete释放类对象的时候,就会根据虚函数表指针指向的空间去释放虚函数表,那么此时就发生了对内存空间的不正确操作,出现了段错误。

这就是使用memset对类对象的误用。即delete一个被 memset为空的带有虚函数的类对象指针时,就会出现段错误。

3.解决办法

不用使用memset对类对象进行操作,使用类的构造函数对对象进行初始化。

心得:对一个问题感到莫名其妙,那是因为我们知道的太少了。

参考文献

[1]http://blog.163.com/longsu2010@yeah/blog/static/17361234820122761525799/

c语言 memset 段错误,段错误之memset对类对象的误用相关推荐

  1. 段错误之 memset 对类对象的误用

    1.问题描述 实际项目中,定义一个如下的基类和子类,均包含有虚函数. //基类 class OriginalTask { public:OriginalTask() {};virtual ~Origi ...

  2. java语言避免了大多数的什么_Java 语言避免了大多数的▁错误。( )_学小易找答案...

    [单选题]11. 已知英文字母m的ASCII码值为6DH,那么ASCII码值为71H的英文字母是 ( D ) . [判断题] 个人努力对于改善命运毫无意义. [单选题]5. 现代微型计算机所采用的电 ...

  3. java语言的数组描述_下列关于Java语言的数组描述中,错误的是()。_学小易找答案...

    [单选题]下面()是正确的main()方法说明. [填空题]Java规定,如果子类中定义的成员方法与父类中定义的成员方法同名,并且参数的( )和类型以及( )的类型也相同,则父类中的同名成员方法被屏蔽 ...

  4. python显示语言错误_Python错误和异常

    错误和异常 Python 中(至少)有两种错误:语法错误和异常( syntax errors 和 exceptions ). 1.1.语法错误 语法错误,也被称作解析错误: while True pr ...

  5. R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator

    R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator 目录 R语言构建随机森林模型错误解决:Erro ...

  6. 智能合约语言 Solidity 教程系列9 - 错误处理

    这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...

  7. python语言包含的错误,Python语言程序中包含的错误,一般分为三种,以下____________不是其中的一种...

    Python语言程序中包含的错误,一般分为三种,以下____________不是其中的一种 答:编译错误 人体体温能自动调控在37度,其原因是( ). 答:人体内产生的热能是分批放出的 人体内有完善的 ...

  8. javadoc: 错误 - 格式错误的语言环境名称_ONLYOFFICE 5.6.0 : 这是一个错误修正版本,改进了德语、法语、意大利语、葡萄牙语和俄语的翻译等...

    ONLYOFFICE 5.6.0 从此版本开始,我们更改了DocumentServer的编号方案. 这是一个错误修正版本. 具有一系列新功能的下一个主要版本将是6.0.0 修正 所有编辑 •修复形状的 ...

  9. 打码(C语言)常见粗心小错误 (前方高能,一定要点)

    打码(C语言)常见粗心小错误 标签(空格分隔): 博客 自我介绍 本人学院 (http://sdcs.sysu.edu.cn/) 欢迎访问 本人学号 16340213 目录 打码C语言常见粗心小错误 ...

最新文章

  1. Android园区部队人脸识别源码门禁项目讲解
  2. 北京计算机科学与技术学院,计算机科学与技术学院
  3. 【转】Asp.net控件开发学习笔记整理篇 - WebControl基类
  4. 各种机械原理动态图,看完脑洞大开,绝对涨姿势!
  5. 35、JAVA_WEB开发基础之过滤器
  6. Visual Studio 2010 sp1
  7. Jquery简单的右侧浮动菜单
  8. 构建插件式的应用程序框架(四)----服务容器
  9. 静态文件之static+url控制系统(萌新笔记)
  10. Atitit 架构之道 之 可读性可维护性架构之道 提升效率架构之道 attilax著 艾龙 著 1.1. Hybrid架构 1 1.2. 分层架构是使用最多的架构模式 Layers模式 也称Tie
  11. neatupload上传文件配置
  12. ubuntu 命令行 ocr 双层pdf OCRmyPDF
  13. python工业机器人_工业机器人编程语言汇总!
  14. element-ui图标不显示问题(已解决)
  15. mongo数据库取并集
  16. HTTPS学习笔记:(3)一文彻底了解PKI与证书
  17. php 获取微博cookie,如何获取微博 Cookie
  18. 共享网卡,让另一台设备有线连接可以上网
  19. 利用和讯博客赚钱步骤详解
  20. 计算机毕业设计Java高校排课管理系统(源码+系统+mysql数据库+lw文档)

热门文章

  1. vue中过渡动画(类名实现方式)
  2. ORM学员管理系统单表查询示例
  3. 模块化数据中心成未来互联网企业首选
  4. JAVA统计字母、数字个数
  5. SCRIPT LOAD lua文件
  6. 【C#】【APK】APK文件解析AXML-层层深入APK文件解析之一
  7. Hyper-V安装(摘自本站)
  8. bootstrap-wysiwyg: 迷你的Bootstrap的所见即所得的HTML富文本编辑器
  9. 基于LBS的兴趣点查询
  10. Linux系统下如何查看已经登录用户