關於cpp構造函數當中使用memset初始化的陷阱

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

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章