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++使用的時候是存在很多陷阱的,稍有不慎可能會造成很大的隱患,以上的問題並不是馬上就一定會暴露出來的,不同的編譯器現象是不一樣的