c++ memset與崩潰

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章