今天看到迅雷2014校招一道筆試題如下:
#include using namespace std;
class parent
;void parent::output()
class son : public parent
;void son::output()
int main()
輸出程式執行結果:程式不輸出結果,執行出錯!!分析一下原因:
在使用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函式
memset某個結構或其它的資料型別在c語言中是非常常見,其目的是對結構或資料型別進行初始化,通常都是將變數置為0。在c 中,針對類物件除了用建構函式初始化物件外,也可以使用memset來進行初始化操作。當然這種情況極其少見,即使如此還是非常有必要談一下這個問題。下面是乙個例子 c 語言 codee...
memset初始化類物件出錯解析
void memset void s,int v,size t n 英文釋義如下 copies the value v converted to type unsigned char to the first n bytes pointed to by s returns s.這裡s可以是陣列名,也...