含虚函数的struct在其构造中要谨慎使用memset函数对数据成员清零
2012-02-01 11:34
232 查看
假设有定义如下
struct st
{
int a;
char b[20];
st(){memset(this, 0, sizeof(st));}
virtual ~st(){}
};
st *p = NULL;
p = new st;
delete p; //p!=NULL, 但程序抛出异常,提示访问了非法内存地址0x000000
如果去掉st结构中析构函数之前的vitual关键字,那么delete就不会有错误。
分析了一下delete出错的原因,是由于st结构中含有虚函数,因此st的对象(实例)
就会含有vfptr指向虚函数表,而构造函数调用memset(this, 0, sizeof(st))将
结构st中的vfptr指针置零,才会导致delete对象时访问vfptr错误,从而抛出异常。
struct st
{
int a;
char b[20];
st(){memset(this, 0, sizeof(st));}
virtual ~st(){}
};
st *p = NULL;
p = new st;
delete p; //p!=NULL, 但程序抛出异常,提示访问了非法内存地址0x000000
如果去掉st结构中析构函数之前的vitual关键字,那么delete就不会有错误。
分析了一下delete出错的原因,是由于st结构中含有虚函数,因此st的对象(实例)
就会含有vfptr指向虚函数表,而构造函数调用memset(this, 0, sizeof(st))将
结构st中的vfptr指针置零,才会导致delete对象时访问vfptr错误,从而抛出异常。
相关文章推荐
- C++中各种数据成员及成员函数的定义及使用
- C++中各种数据成员及成员函数的定义及使用
- 二十二、标准库类型vector的使用、vector介绍、vector构造和初始化、vector常用成员函数
- C++中各种数据成员及成员函数的定义及使用
- 使用友元函数实现用外部函数修改类内的私有数据成员
- 声明一个Circle类,有数据成员radius(半径),成员函数area(),计算圆的面积,构造一个Circle的对象进行测试
- C++中各种数据成员及成员函数的定义及使用
- C++中各种数据成员及成员函数的定义及使用
- 在SQL中使用CLR提供基本函数对二进制数据进行解析与构造
- C++中各种数据成员及成员函数的定义及使用
- 定义圆类Circle,数据成员有半径radius,成员函数有默认构造函数(默认半径为10)、构造函数、计算圆面积、圆周长以及输出函数,分别构造默认对象和半径为15的对象,输出各对象的周长与面积。
- 3第一周课后练习·阅读计划(3)-使用函数来访问私有数据成员
- 定义长方体类,数据成员有长、宽、高,成员函数有带默认形参值的构造函数(默认长宽高分别为2.5、3.4、2)、计算体积函数,分别构造默认对象和长宽高分别为6.25、4.8、5.2的对象,输出各对象的体积
- 在C/C++中的struct使用函数指针,而且在C++中的struct还能使用成员函数
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
- 使用成员函数访问私有数据成员
- 在类中使用_beginthreadex函数创建线程并访问该类中的数据成员
- C++中各种数据成员及成员函数的定义及使用
- C++中各种数据成员及成员函数的定义及使用
- c/c++ c++类_类的实例_数据成员_成员函数_构造/析构函数的概念