天天看點

深度探索C++對象模型第六章 執行其語義學

6.1  對象的構造和解構

對象的解構發生在離開目前區域之前,而不是說大括号之前

對象數組:編譯器調用一個甯為vec_new()的函數,産生出以class object對象構造而成的數組。

void * vec_new(void * array,      //  數組的起始位址

               size_t elem_size,  //  每個class object的大小

               int elem_cout,     //  數組元素的個數

               void (* construcotr) (void*) ,  // default constructor 的函數指針

               void (* destructor) (void * , char) // default destructor的函數指針

參數array帶有的若不是具名數組的位址,就是0。如果時0 ,那麼數組江經由應用程式的new運算符,被動态配置于heap中! 載vec_new被調用的過程中,會存放相應的cokkie,儲存次記憶體塊的元素個數。注意:是元素個數,而不是整個數組的大笑。是以使用base pointer釋放 derived pointer會引起記憶體洩漏噢!

point knowts[10];  --->vec_new(&knots,sizeof(point),10,&point::point,0)

point knowts[10]={ point(),point(1,2,3) } -->point::point (&knots[0] );

                                             point::point (&knots[1] );

                                             vec_new(&&knowts+3*sizeof(point) , sizeof(point), 7,&point::point ,0)

point3d *p_array = new point3d[10];  

         ---->  point3d * p_array;

                p_array = vec_new ( 0, sizeof(point3d),10,&point::point,&point3d::~point3d);

釋放資源:void*  vec_delete(

                  void * array,       //  數組起始位址

                  size_t  elem_size,  //  每個object 的大小

                  int   elem_count,   //  述組中的元素數目

                  void (*destructor) (void*, char)

                 )

Placement Operator new 的語義

point2w *ptw = new (arena) point2w;

釋放方法: ptw->~point2w();