c++ memset与崩溃

c++中提供了函数memset,主要用于一段内存内容的初始化(基于字节为单位)。

参数1为进行初始化的内存首地址,参数2为初始化的值(虽然是个int但实际只能用0~255,因为是按字节初始化),参数3为初始化的内存大小(字节为单位)。

比较常见的用法类似于下例:

class TempClass {
public:
	TempClass() { memset(this, 0, sizeof(*this); };
	// ...
	
private:
	char name_[20];
	int value_;
};

用于类的成员变量初始化,可以省去对每个成员变量进行初始化的代码编写。

但memset实际并不是适用于所有类,某些情况下还是需要老老实实进行初始化。

1. 类成员中含有stl容器。

2. 类中(或父类)含有虚构函数。

其中情况1比较容易理解,stl容器均基于迭代器进行访问,与基础的数据结构不同,其中包含了大量的指针和寻址操作,因此将其内存直接初始化的结果是,指针中存储的地址异常,stl容器内部函数进行寻址时引发非法访问内存等错误。

而情况2则是基于类的虚函数实现模式导致的,若类中含有虚函数,则该类的每一个实例对象都会在首地址处存储对应虚函数表的地址,占用一个指针的大小(详细可见博主的另一篇博客:虚函数表的存放)。因此memset将实例对象的内存直接初始化后,其存储的虚函数表地址异常,实际寻址时引发错误。

那么问题来了,如果存在类的继承关系,父类构造函数中调用了memset函数,子类中为正常初始化,这样是否会对子类的实例造成影响呢?

奇怪的问题又增加了!

(还不写个代码确认下,GKD)

猜你喜欢

转载自blog.csdn.net/Vis_Stu/article/details/106367517