類物件與memset函式

2021-07-27 10:39:59 字數 1411 閱讀 8215

memset某個結構或其它的資料型別在c語言中是非常常見,其目的是對結構或資料型別進行初始化,通常都是將變數置為0。在c++中,針對類物件除了用建構函式初始化物件外,也可以使用memset來進行初始化操作。當然這種情況極其少見,即使如此還是非常有必要談一下這個問題。

下面是乙個例子:

c++語言: 

codee#12885

01 include 

>

0203

class

base

04  08

virtual

~base () {}

09     base (

constbase 

&rhs)  10

11voidshow ()  12

virtual

voidprint () 

13 }; 14

15class

derive

:publicbase

16  19

~derive () {}

20     derive (

constderive 

&rhs)

: base(rhs) {} 21

22voidprint () 

23 }; 24

25intmain (

void)

26 編譯執行結果如下:

在使用memset初始化物件obj之前,通過obj呼叫show和print函式時程式執行正常,但是一旦利用memset函式初始化該物件,再對該obj呼叫show和print函式,則程式立馬崩潰。

究其原因是

因為初始化obj的時候,將obj包含的指向虛函式表vtbl的指標也清除了。包含虛函式的類物件都有乙個指向虛函式表的指標,此指標被用於解決執行時和動態型別強制轉換時虛函式的呼叫問題。該指標是被隱藏的,對程式設計師來說,這個指標也是不可訪問的。當進行memset操作時,這個指標(即指向虛函式表的位址)的值也要被初始化,這樣一來,只要一呼叫虛函式,程式便會崩潰。

這種現象在很多由c轉向c++的程式設計師來說,很容易犯這個錯誤,而且這個錯誤很難查。

為了避免這種情況,記住對於有虛函式的類物件,決不能使用memset來進行初始化操作。而是要用預設的建構函式或其它的init例程來初始化成員變數。

類物件與memset函式

memset某個結構或其它的資料型別在c語言中是非常常見,其目的是對結構或資料型別進行初始化,通常都是將變數置為0。在c 中,針對類物件除了用建構函式初始化物件外,也可以使用memset來進行初始化操作。當然這種情況極其少見,即使如此還是非常有必要談一下這個問題。下面是乙個例子 c 語言 codee...

memset函式操作類物件

今天看到迅雷2014校招一道筆試題如下 include using namespace std class parent void parent output class son public parent void son output int main 輸出程式執行結果 程式不輸出結果,執行出錯...

memset 函式與sort 函式

陣列的初始化及資料的排序 include include include include using namespace std int main int n while cin n int data n memset data,0,sizeof data memset 陣列名,初值,sizeof ...