c++中提供了函數memset,主要用於一段內存內容的初始化(基於字節爲單位)。
參數1爲進行初始化的內存首地址,參數2爲初始化的值(雖然是個int但實際只能用0~255,因爲是按字節初始化),參數3爲初始化的內存大小(字節爲單位)。
比較常見的用法類似於下例:
class TempClass {
public:
TempClass() { memset(this, 0, sizeof(*this); };
// ...
private:
char name_[20];
int value_;
};
用於類的成員變量初始化,可以省去對每個成員變量進行初始化的代碼編寫。
但memset實際並不是適用於所有類,某些情況下還是需要老老實實進行初始化。
1. 類成員中含有stl容器。
2. 類中(或父類)含有虛構函數。
其中情況1比較容易理解,stl容器均基於迭代器進行訪問,與基礎的數據結構不同,其中包含了大量的指針和尋址操作,因此將其內存直接初始化的結果是,指針中存儲的地址異常,stl容器內部函數進行尋址時引發非法訪問內存等錯誤。
而情況2則是基於類的虛函數實現模式導致的,若類中含有虛函數,則該類的每一個實例對象都會在首地址處存儲對應虛函數表的地址,佔用一個指針的大小(詳細可見博主的另一篇博客:虛函數表的存放)。因此memset將實例對象的內存直接初始化後,其存儲的虛函數表地址異常,實際尋址時引發錯誤。
那麼問題來了,如果存在類的繼承關係,父類構造函數中調用了memset函數,子類中爲正常初始化,這樣是否會對子類的實例造成影響呢?
奇怪的問題又增加了!
(還不寫個代碼確認下,GKD)