天天看點

深度探索C++對象模型筆記 —— 第六章

  1. C++程式中所有的global objects都被放置在程式的data segment,如果顯示指定給它一個值,此object将以該值為初值,否則object所配置到的記憶體内容為0
  2. 語言要求每次調用new都傳回一個獨一無二的指針,是以如果size等于0傳回一個1-byte的記憶體區塊
  3. 如果我們配置一個數組,内含1個Point3d objects,我們會預期Point 和Point3d的構造函數被調用10次,每次作用于數組中的一個元素

    而當我們delete由ptr所指向的10個Point3d元素時, 施行于數組上的析構函數,是根據交給vec_delete()函數的“被删除之指針類型的析構函數”——本例中正是Point 析構函數。不止執行錯誤的析構函數,而且自從第一個元素之後,該析構函數即被施行于不正确的記憶體區塊中(因為元素的大小不對)

    最好就是避免以一個base class指針指向一個derived class objects所組成的數組,如果一定要這樣寫程式,可以這麼寫:

    for(int i=0;i<elem_count;i++)
    {
    	Point3d *p=&((Point3d*)ptr)[i];
    	delete p;
    }
               
  4. 一般而言,placement new operator并不支援多态,被交給new的指針,應該适當指向一塊預先配置好的記憶體。如果derived class比base class大,例如 Point3d的constructor将會導緻嚴重的破壞
  5. 臨時對象被摧毀,應該時對完整表達式求值過程中的最後一個步驟

繼續閱讀