C memset初始化物件注意點

2021-09-02 06:49:40 字數 1170 閱讀 2504

c語言,在利用struct進行資料封裝時,經常會使用memset(this,0,sizeof(*this))來初始化。而c++中,有時候也會用到struct,在利用memset進行初始化時,非常容易踩坑,有些地方需要注意。

1. memset 是按位元組對記憶體塊進行初始化的函式,用來給某一塊記憶體空間進行賦值的;

2. memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法;

3. 成員變數可以是簡單的內建型別(short、int、long、char、float、double);

4. memset函式不能將int陣列初始化為0和-1之外的其他值(除非該值高位元組和低位元組相同):

memset是逐字節進行初始化,比如對整型數進行初始化,int是32位的共四個位元組,每個位元組設定為n,則

如果n=1,1為00000001 00000001 00000001 00000001,轉為十進位制數是1+1*2^8+1*2^16+1*2^24=16843009,而不是1;

如果n=0,0為 00000000 00000000 00000000 00000000,轉化為十進位制為0;

如果n=-1,-1為 11111111 11111111 11111111 11111111(原碼的反碼的補碼),轉化後為-1。    

5. 類中含有c++型別的物件(string, list, set, map等)時,千萬不要使用memset進行初始化,因為會破壞物件的記憶體,可用建構函式來實現;

6. 類含有虛函式表時,初始化會破壞虛函式表,後續對虛函式的呼叫都將出現異常;

7. 類含有指標時,初始化時,並不會初始化指標指向物件的值,而會把該指標設定為0;

#include #include using namespace std;

int main()

; test test;

memset(&test,0, sizeof(test));

}

程式在第12行建立test 物件,在程式執行完後會自動執行 test的析構。但是,在析構到test的string成員 b 的時候,由於b的記憶體被memset破壞,因此不能正常析構,從而導致crash。

物件初始化

在oc中使用alloc後,會分配到一塊記憶體塊,同時這塊記憶體塊會被清零,所以初始化函式init是不需要再做置零的操作的。在oc中,應該在alloc後就呼叫初始化函式init,使用new可以達到這個效果,但new不是oc的風格。物件在init時,應該先使用其父類的init,然後再使用自己的init行...

物件初始化

我們知道當使用new關鍵字建立乙個物件的時候,會呼叫相應的建構函式對該物件進行初始化,那麼這個過程中到底都還有什麼事情呢?先看一段 當執行語句 student stu new student zhangsan 17 執行該語句的時候在記憶體中程式都做了什麼事情,讓我們一一枚舉出來 1 因為new用到...

物件初始化

每乙個物件都應該在建立之時就有確定的內容,否則就失去了物件的意義了。定義乙個物件,在系統為其分配記憶體時,應該同時對有關的資料成員賦初始值。首先,不能在類宣告中對資料成員初始化。因為類不是實體,而是抽象型別,不占用記憶體而無處容納資料。如果類中資料為私有或受保護的,則不能在定義物件時賦初值。time...