memset初始化类对象出错解析
来源:互联网 发布:xboxone手柄测试软件 编辑:程序博客网 时间:2024/05/07 00:36
void *memset(void *s, int v, size_t n);
英文释义如下:
Copies the value v (converted to type unsigned char) to the first n bytes pointed to by s; returns s.
这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s);
使用memset时要注意的是,memset是逐字节进行填充,所以s一般为char *型。对于其它类型的s,可以填充的值有两个,0和-1。这是因为计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1。如果要 初始化为其它的值,可以用一个for循环,如:
for(int i=0;i<n;i++)s[i]=v;
memset 某个结构(或其它的数据类型)在C语言中是很常见的代码,其目的是对结构(或其它的数据类型)进行初始化,通常都是将变量置为NULL或者0。在C++ 中,针对类对象除了用构造函数初始化对象外,也可以使用memset来进行初始化操作(确实有这种情况,不得已而为之,请大家不要把鸡蛋砸过来!)。但是 一定要注意以下所说的这种情况:如果类包含虚拟函数,则不能用 memset 来初始化类对象。下面是一个例子:
class GraphicsObject{protected:char *m_pcName;int m_iId;//etcpublic:virtual void Draw() {}virtual int Area() {}char* Name() { return m_pcName;}};class Circle: public GraphicsObject{void Draw() { /*draw something*/ }int Area() { /*calculate Area*/ }};void main(){GraphicsObject *obj = new Circle; // 创建对象memset((void *)obj,NULL,sizeof(Circle)); // memset to 0obj->Name(); // 非虚函数调用没问题obj->Draw(); // 在这里死得很难看}
结 果我就不说了。因为每个包含虚函数的类对象都有一个指针指向虚函数表(vtbl)。这个指针被用于解决运行时以及动态类型强制转换时虚函数的调用问题。该 指针是被隐藏的,对程序员来说,这个指针也是不可存取的。当进行memset操作时,这个指针的值也要被overwrite,这样一来,只要一调用虚函 数,程序便崩溃。这在很多由C转向C++的程序员来说,很容易犯这个错误,而且这个错误很难查。
为了避免这种情况,记住对于有虚拟函数的类对象,决不能使用 memset 来进行初始化操作。而是要用缺省的构造函数或其它的 init 例程来初始化成员变量。
- memset初始化类对象出错解析
- memset() 初始化类对象
- memset初始化类 在调用虚函数时的出错分析
- 类对象与memset函数
- memset函数操作类对象
- 类对象与memset函数
- 内存初始化函数memset()
- memset快速初始化数组
- memset()字符串初始化
- memset初始化维数组
- memset函数 数组初始化
- memset 函数初始化用法
- memset 函数初始化用法
- memset结构体初始化
- memset初始化问题
- memset初始化内存
- memset函数初始化数组
- Memset 初始化问题
- 人工智能之博弈二、最大最小值方法
- 注意记录Struts2关于值栈的理解,解决重复用户登录的问题
- 面向类的适配器模式
- android 彻底关闭应用程序
- 人工智能之博弈三、α-β截断
- memset初始化类对象出错解析
- 人工智能之博弈四、深度搜索
- gcc-none-linux-gnueabi-gcc -v :commond not found的解决
- emacs 配置(备份)
- windows溢出保护原理与绕过方法概览
- 人工智能之博弈五、广度搜索
- Apache2.2.22 + PHP5.2.17 + MySQL5.5.22 快速搭建部署PHPWind开源论坛
- Thrift安装[转载]
- firefox ie table 布局 兼容性问题