C 建構函式使用memset初始化可能導致的問題

2021-10-06 18:22:50 字數 983 閱讀 7644

今天在寫**的時候突然遇到乙個中斷問題,但是光看**根本發現不了錯誤,**大概類似於:

typedef struct memsettest

}memsettest;

int main()

其中為map新增值那一行會報錯。

遇到這個問題之後看**是在想不出問題在哪,然後我就把源**中memsettest的結構體給複製到了乙個新的工程中測試,但是還是會爆錯,於是我試著刪除了memsettest的m_map變數,在測試是可以正常執行的;但是變得更迷惑了,map用了沒有一千也有八百次了,為什麼這裡會宕機?就繼續刪**一點點測試,最後刪到發現有memset與map同時存在就會出問題;在網上一搜尋了解到問題果然出現在memset上:memset()函式將物件的所有記憶體都初始化為0,這在初始化的類是乙個pod型別(plain old data)時是沒有問題的,因為pod型別的二進位制內容可以隨便複製、移動、重置而不會改變pod型別物件的值。configsettings成員都是pod型別(int,char,float…),而且configsettings類既不存在虛繼承也不存在虛函式,所以可以對configsettings使用memset()函式進行初始化。但是因為我在memsettest中加入了map型別的成員變數,就導致memsettest不再是乙個pod型別結構,所以當使用memset()函式進行初始化時會對物件造成破壞,map底層是紅黑樹,其中必然包括各種指標,當使用memeset將物件所有記憶體初始化為0的時候,map中的各種指標必然就變成了null_ptr,整個結構已經被完全破壞了,所以會後面對map進行操作的時候就會出現崩潰。

重新寫memsettest的建構函式,不再使用memset()函式初始化物件。

將成員變數map設定為static型別,可以避免在memset()時被破壞.

另外以後一定要注意建構函式初始化盡量不要直接使用memset,因為就算你寫的時候是乙個pod結構,但隨著時間的流逝後續其他人維護就可能新增指標等,到時他如果不了解這個問題就又會困住他好久。

memset函式初始化

對於絕大多數編譯器來講,char namekey 15 與memset namekey,0x0,sizeof namekey 或memset namekey,0 sizeof namekey 這三個是一樣的。但是有的編譯器,char namekey 15 只將namekey 0 給賦值為 0 其他成...

memset函式初始化

標頭檔案 incldue 靜態陣列 int num 10 memset num,0,sizeof num 初始化為 0 memset num,1 sizeof num 初始化為 1 memset num,0x3f sizeof num 初始化為無窮大 memset num,0x3f sizeof n...

memset 函式初始化

memset 函式標頭檔案及原型 include void memset void s,int c,unsigned long n 功能 對一段申請的記憶體進行初始化,mem即memory 記憶體 memset即給記憶體設定 初值 引數說明 將 指標變數 s所指向的記憶體單元中的前n個位元組用 整型...