2014-02-14 62 views
0

請考慮以下代碼。動態創建對象並將其memset設置爲0

class A 
{ 
    private : 
     int a; 
    public : 
     void function1() 
     { 
       cout<<"hello world"<<endl; 
     } 
     void function2() 
     { 
       cout<<"bye bye world"<<endl; 
     } 
}; 
int main() 
{ 
    A *obj = new A(); 
    memset(obj,0,sizeof(A)); 

    obj->function1(); 
    obj->function2(); 
    delete obj; 
    return 0; 
} 

函數調用不應該失敗。當我嘗試運行此代碼時,它運行得非常好。 爲什麼memset對方法的地址沒有任何影響? 你能解釋一下發生了什麼。

+4

函數不存儲在每個對象中。這將是一個巨大的空間浪費。 – chris

+1

爲什麼要在構造的對象上調用memset()? – EJP

回答

1

取功能&A::function1的地址並打印出來。將它與對象&obj的地址進行比較。

在內存中,對象本身只包含其非靜態數據成員和可能的單個vtable指針。

實際的方法是代碼而不是數據。它們在所有對象之間共享,您無法更改它們。在幕後,類方法只是「特殊」函數,除了程序員指定的參數外,它們還透明地接受這個指針。

這就是說,如果你用零填充它們的內部狀態,你真的可以搞砸一些對象。 「

0

編譯器不存儲具有類實例的成員方法或靜態成員。因此memset對方法地址沒有任何影響。

0

」實際的方法是代碼而不是數據,它們在所有對象之間共享,並且你不能改變它們。在幕後,類方法只是「特殊」函數,它除了指定的參數外,還透明地接受這個指針。程序員。」

以上是正確的,除了你沒有試圖訪問任何虛函數,所以代碼工作正常。如果你使任何方法都是虛擬的,那麼VPTR將被memset設置爲NULL,並且可能存在分段錯誤(或未定義的行爲)。

謝謝 PRaveen