三九宝宝网宝宝百科宝宝知识

不当使用memset函数带来的麻烦问题

11月11日 编辑 39baobao.com

[小儿便秘的7个原因家长喂养不当排第一]小儿便秘虽然常见,但却是一件令人非常痛苦的事情。看着孩子想拉但又拉不出来,整个脸胀得通红,小屁屁痛得难受了只能又哭又叫,严重的时候还可能发生肛裂。妈心里着急难受的的那个...+阅读

通常在C的编程中,我们经常使用memset函数将一块连续的内存区域清零或设置为其它指定的值,最近在移植一段ja代码到C++的时候,不当使用memset函数花费了我几个小时的调试时间。考试大提示: 对于虚函数的底层机制很多资料都有较详细阐述,这次的调试感触颇深。

先来看一段代码,在继承的类Advance之中,有很多属性字段,Examda希望将其清成0或NULL,于是在构造函数中Examda通过memset将当前类的所有属性置0。

class Base{

public:

virtual void kickoff() = 0;

};

class Advance:public Base{

public:

Advance(){

memset(this, 0, sizeof(Advance));

}

void kickoff(){

count++;

... do something else;

}

private:

int attr1, attr2;

char* label;

int count;

... other attributes, they should be initiated to 0 or NULL at beginning.

};

int _tmain(int argc, _TCHAR* ar[])

{

Base* ptr = new Advance();

ptr->kickoff();

return 0;

}

这样看似能正常运行,但运行程序时,你会发现类似于下面的错误:

TestVirtual.exe 中的 0x00415390 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突

同时断点停留在ptr->kickoff()处,从错误提示我们可以得知无法调用kickoff方法,这个方法的指针没有被正确初始化,但为什么呢?

指出问题之前,先看看这段文献上的关于虚函数机制的说明:

函数赖以生存的底层机制:vptr + vtable。

虚函数的运行时实现采用了VPTR/VTBL的形式,这项技术的基础:

①编译器在后台为每个包含虚函数的类产生一个静态函数指针数组(虚函数表),在这个类或者它的基类中定义的每一个虚函数都有一个相应的函数指针。

②每个包含虚函数的类的每一个实例包含一个不可见的数据成员vptr(虚函数指针),这个指针被构造函数自动初始化,指向类的vtbl(虚函数表)

③当客户调用虚函数的时候,编译器产生代码反指向到vptr,索引到vtbl中,然后在指定的位置上找到函数指针,并发出调用。

这里的问题,就出在

memset(this, 0, sizeof(Advance));

上面,虚函数指针应该在进入构造函数赋值体之前自动初始化的,而memset却又将已经初始化好的指针清0了,这就是为什么会产生上面的访问零址的错误。将上面的memset语句去除程序就可以正常运行了。

所以,从上面的问题中,我们可以看出在构造函数体内调用memset将整个对象清0是很有风险的,当没有虚函数的时候上面程序可以正常运行(可以试着将Base类的纯虚函数声明改成非虚函数再运行程序)。初始化类的属性对象时,比较稳妥的办法还是手动逐个进行初使化。

以下为关联文档:

Excle函数中的最大值和最小值如何用2填入一些数据作为事例。3选中一个放最大值的单元格。4找到顶部菜单栏中的公式-》自动求和-》最大值。5选择之后,系统会自动帮我们选择要计算的范围,你也可以自己选择你想...

如何自定义函数2然后点击插入---模块,如图:3然后在模块1中出入,三角形面积公式函数(Function V(a,b,h)V = h*(a+b)/2End Function),如图:4关闭模块,自定义函数完成扩展选定区域快捷键End+Shi...

用药不当,可能导致失聪人们常常会用“眼睛是心灵的窗户”来形容眼睛,足以说明眼睛的重要。同样是人的五官,却很少听到有人说耳朵如何重要。殊不知,由于人们对耳疾重视不够,造成大量的耳聋是由于中耳...

学步车用的不当,会对小孩子的骨骼产生不良影响前言:育儿专家指出对于小孩子过早的坐学步车车,很容易导致孩子的骨骼出现“X”或“O”型腿,所以专家指出对于小孩子的学步车,学的早不如学的好,下面就让专家通过一个实例来为我们...

用药不当对孩子造成的危害前言:对于给0-2岁这个阶段的小宝宝用药,是一件必须非常慎重的事情,用药不当可是会给宝宝带来终生的伤害!家长们应该非常的小心的注意这方面的内容,免得给孩子造成严重的伤害。 0-...

炒菜不当,易有致癌物质前言:如果妈妈炒菜方法不当也会生出致癌物质,也许家长们都还不知道其中的原因,以下就让我们来详细的了解下吧,希望大家都能够走出一些饮食的误区,远离致癌物质的侵袭! 炒菜别等油...

家长别拿青春痘不当回事前言:很多人都存在这样的观点,青春痘是证明年轻的象征,它是每一个成长中的人都要经历的一个过程,就好像是蜕变一样。因此有不少的孩子长青春痘是,家长都是一再的忽视这样的行为是...

别拿孩子的青春痘不当回事前言:有一些家长们认为当孩子到了青春期时肯定会长痘痘的,是正常的现象是孩子发育必经的一个阶段。因此家长就会忽视了孩子长痘痘,按科学的角度来说家长的决定对孩子来说是正确...

不当的方式致孩子产生恐惧感前言:当父母们遇到孩子不听话的时候就容易吓唬孩子,但是家长们不正确的恐吓方式往往会给孩子们留下恐惧“后遗症”,以下就让我们结合实例来详细的了解下,希望在平时的生活之中家...

推荐阅读
图文推荐