最好不要用 memset 来初始化一个类,而是用构造函数
来源:互联网 发布:截面数据来源 编辑:程序博客网 时间:2024/06/06 11:04
如果我们用 C++ 类来编写程序且这个类中有虚函数,则他的初始化必须放在构造函数中,释放必须放在析构函数中,而不能试图用 memset 来初始化,为什么呢,因为 memset 把类内隐藏的虚函数指针也置为 0 了,看下面的例子代码
class Base
{
public:
Base(void)
{
}
virtual ~Base(void)
{
}
};
class Derive : public Base
{
public:
Derive(void)
{
}
virtual ~Derive(void)
{
}
};
void CDeletezsfededDlg::OnButton1()
{
Derive *p = new Derive;
memset(p, 0, sizeof(*p)); ///虚函数表也被置为 0
delete p; ///试图调用基类 Base 和继承类 Derive 的虚析构函数,因为
///虚函数表被置为 0,所以内存访问错误
p = NULL;
}
其它的虚函数,也存在这样的问题,所以一定要小心啊
- 最好不要用 memset 来初始化一个类,而是用构造函数
- 类的初始化不在构造函数中,而写一个函数来专门初始化比较好
- 用memset函数初始化字符数组
- 结构和类中字段的初始化以及用new来操作他们的构造函数
- DataReader最好不要用,
- 父类的构造函数中最好不要调用虚函数
- 拷贝构造函数,用一个对象的值初始化一个新构造的对象
- 关于cpp构造函数当中使用memset初始化的陷阱
- 关于cpp构造函数当中使用memset初始化的陷阱
- 关于cpp构造函数当中使用memset初始化的陷阱
- 内存初始化函数memset()
- memset函数 数组初始化
- memset 函数初始化用法
- memset 函数初始化用法
- memset函数初始化数组
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- 20101208
- (转)面向程序员的数据库访问性能优化法则
- 项目开发经验
- 2010.11 Linux内核分析第三次作业
- 基于double lock的多线程安全的Singleton实现要点
- 最好不要用 memset 来初始化一个类,而是用构造函数
- .net圆形按钮的实现
- Broken Necklace
- HP-UX操作系统的内存
- 正确理解数字在内存中高位在高位,低位在低位
- 《大家一起学习android》第一篇 Java基础学习
- memset 填充初值的方法
- SVN的权限与路径名
- c 语言 宏 #line (转)