c语言 memset 段错误,段错误之memset对类对象的误用
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对类对象的误用相关推荐
- 段错误之 memset 对类对象的误用
1.问题描述 实际项目中,定义一个如下的基类和子类,均包含有虚函数. //基类 class OriginalTask { public:OriginalTask() {};virtual ~Origi ...
- java语言避免了大多数的什么_Java 语言避免了大多数的▁错误。( )_学小易找答案...
[单选题]11. 已知英文字母m的ASCII码值为6DH,那么ASCII码值为71H的英文字母是 ( D ) . [判断题] 个人努力对于改善命运毫无意义. [单选题]5. 现代微型计算机所采用的电 ...
- java语言的数组描述_下列关于Java语言的数组描述中,错误的是()。_学小易找答案...
[单选题]下面()是正确的main()方法说明. [填空题]Java规定,如果子类中定义的成员方法与父类中定义的成员方法同名,并且参数的( )和类型以及( )的类型也相同,则父类中的同名成员方法被屏蔽 ...
- python显示语言错误_Python错误和异常
错误和异常 Python 中(至少)有两种错误:语法错误和异常( syntax errors 和 exceptions ). 1.1.语法错误 语法错误,也被称作解析错误: while True pr ...
- R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator
R语言构建随机森林模型错误解决:Error in y - ymean : non-numeric argument to binary operator 目录 R语言构建随机森林模型错误解决:Erro ...
- 智能合约语言 Solidity 教程系列9 - 错误处理
这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...
- python语言包含的错误,Python语言程序中包含的错误,一般分为三种,以下____________不是其中的一种...
Python语言程序中包含的错误,一般分为三种,以下____________不是其中的一种 答:编译错误 人体体温能自动调控在37度,其原因是( ). 答:人体内产生的热能是分批放出的 人体内有完善的 ...
- javadoc: 错误 - 格式错误的语言环境名称_ONLYOFFICE 5.6.0 : 这是一个错误修正版本,改进了德语、法语、意大利语、葡萄牙语和俄语的翻译等...
ONLYOFFICE 5.6.0 从此版本开始,我们更改了DocumentServer的编号方案. 这是一个错误修正版本. 具有一系列新功能的下一个主要版本将是6.0.0 修正 所有编辑 •修复形状的 ...
- 打码(C语言)常见粗心小错误 (前方高能,一定要点)
打码(C语言)常见粗心小错误 标签(空格分隔): 博客 自我介绍 本人学院 (http://sdcs.sysu.edu.cn/) 欢迎访问 本人学号 16340213 目录 打码C语言常见粗心小错误 ...
最新文章
- Android园区部队人脸识别源码门禁项目讲解
- 北京计算机科学与技术学院,计算机科学与技术学院
- 【转】Asp.net控件开发学习笔记整理篇 - WebControl基类
- 各种机械原理动态图,看完脑洞大开,绝对涨姿势!
- 35、JAVA_WEB开发基础之过滤器
- Visual Studio 2010 sp1
- Jquery简单的右侧浮动菜单
- 构建插件式的应用程序框架(四)----服务容器
- 静态文件之static+url控制系统(萌新笔记)
- Atitit 架构之道 之 可读性可维护性架构之道 提升效率架构之道 attilax著 艾龙 著 1.1. Hybrid架构	1 1.2. 分层架构是使用最多的架构模式 Layers模式 也称Tie
- neatupload上传文件配置
- ubuntu 命令行 ocr 双层pdf OCRmyPDF
- python工业机器人_工业机器人编程语言汇总!
- element-ui图标不显示问题(已解决)
- mongo数据库取并集
- HTTPS学习笔记:(3)一文彻底了解PKI与证书
- php 获取微博cookie,如何获取微博 Cookie
- 共享网卡,让另一台设备有线连接可以上网
- 利用和讯博客赚钱步骤详解
- 计算机毕业设计Java高校排课管理系统(源码+系统+mysql数据库+lw文档)