关于cpp构造函数当中使用memset初始化的陷阱
2011-03-28 19:01
183 查看
memset在c中是用的非常频繁的初始化函数了,当然也被带到了cpp当中,因为当有如下类涉及到非常多的成员变量,很多coder经常偷懒改用memset在构造函数当中初始化
struct Test
{
int _1;
int _2;
long _3;
...
Test(){memset(this,0,sizeof(Test));}
};
以上如果所有成员变量是简单的内置类型是没有问题,但是可能某次需求迫使你需要往Test中增加一个数组,如下
struct Test
{
int _1;
int _2;
long _3;
...
std::vector<int> _n;
Test(){memset(this,0,sizeof(Test));}
};
结果在不同的编译器是不同的,最好的情况当然是启动时程序就挂掉了,至于为什么会挂掉,明白vector中实现了什么就知道了,当然不仅仅是vector,其他stl或者自己定制的容器可能都存在这个问题。
上面是一个陷阱,再一个陷阱就是在派生类的构造函数当中使用memset的问题
class Base
{
int _a;
};
class Derive : public Base
{
public:
Derive(){memset(this,0,sizeof(Derive));}
};
以上代码看出问题了没?
如果在改成下面的呢?
class Base
{
int _a;
public:
virtual ~Base(){}
};
memset做了一件本来你是做不到的事情,那就是把Derive的虚表指针也之位0了,结果当然就是内容泄露了
总结:
memset在内存操作方面太灵活了,但是我们也得注意在c++使用的时候是存在很多陷阱的,稍有不慎可能会造成很大的隐患,以上的问题并不是马上就一定会暴露出来的,不同的编译器现象是不一样的
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qqwx_1986/archive/2010/06/23/5690250.aspx
struct Test
{
int _1;
int _2;
long _3;
...
Test(){memset(this,0,sizeof(Test));}
};
以上如果所有成员变量是简单的内置类型是没有问题,但是可能某次需求迫使你需要往Test中增加一个数组,如下
struct Test
{
int _1;
int _2;
long _3;
...
std::vector<int> _n;
Test(){memset(this,0,sizeof(Test));}
};
结果在不同的编译器是不同的,最好的情况当然是启动时程序就挂掉了,至于为什么会挂掉,明白vector中实现了什么就知道了,当然不仅仅是vector,其他stl或者自己定制的容器可能都存在这个问题。
上面是一个陷阱,再一个陷阱就是在派生类的构造函数当中使用memset的问题
class Base
{
int _a;
};
class Derive : public Base
{
public:
Derive(){memset(this,0,sizeof(Derive));}
};
以上代码看出问题了没?
如果在改成下面的呢?
class Base
{
int _a;
public:
virtual ~Base(){}
};
memset做了一件本来你是做不到的事情,那就是把Derive的虚表指针也之位0了,结果当然就是内容泄露了
总结:
memset在内存操作方面太灵活了,但是我们也得注意在c++使用的时候是存在很多陷阱的,稍有不慎可能会造成很大的隐患,以上的问题并不是马上就一定会暴露出来的,不同的编译器现象是不一样的
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qqwx_1986/archive/2010/06/23/5690250.aspx
相关文章推荐
- 关于cpp构造函数当中使用memset初始化的陷阱
- 关于在构造函数中使用memset或者ZeroMemery问题
- 关于何时使用构造函数,何时使用初始化函数
- 提高C#编程水平的50个要点 之十三“使用静态构造函数来初始化静态成员变量”
- 关于eclipse当中使用SmartUpload使用相对路径的问题
- 关于strcpy、memset、memcpy的使用详解
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
- 关于使用个推初始化个推实例的过程中出现的问题
- C++中构造函数中使用函数进行初始化
- iOS 关于使用xib创建cell的两种初始化方式
- 关于结构体定义时初始化及结合数组使用问题 示例
- C++构造函数对类成员变量初始化,使用初始化列表和构造函数内部直接赋值 的区别
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
- Effective C# 使用构造函数初始化语句
- 关于memset的使用
- 一个关于memset使用的问题
- 何时构造函数必须使用初始化列表而不是赋值
- 类的变量初始化是直接使用初始化器还是放在构造函数中?
- 使用初始化清单和直接在构造函数内初始化成员变量的区别
- 构造函数初始化表的使用规则