C++物件模型之六 執行期筆記 (轉)

amyz發表於2007-11-13
C++物件模型之六 執行期筆記 (轉)[@more@] 

C++模型之六 執行期筆記:namespace prefix = o ns = "urn:schemas--com::office" />

1 物件的構造和析構

  儘可能地把物件的宣告放在使用它的那個區段附近。

foo()

{

Point pointa;  //馬上構造

if ( cache)

  return 1; // 這裡會析構是多餘的,而且是浪費的

pointa.run()

return 0; //這裡也會析構是正常的。

}

foo()

{

if ( cache)

  return 1; // 這裡就不會了

Point pointa;  //馬上構造

pointa.run()

return 0; //這裡也會析構是正常的。

}

2 全域性物件

一般會對沒有初始化的物件自動初始化為零。在主程式裡最前面初始化這些全域性物件,在程式退出之前將會自動地釋放全域性物件。

3 物件陣列

 point konts[10];

假如point 有構造和析構的話,將輪流構造或析構每個物件。假如有虛基類將採用vec_vnew()來構造否則是vec_new().

Void *vec_new ( void *array, size_t elem_size,int elem_count, void(*構造)(void*),void(*析構) (void * char))

Void * vec_delete(void *array,size_t elem_size,int elem_count,void(*析構)(void *,char));

point konts[10];

Vec_new( &kontes,sieof ( point ),10,&point::point,0);

假如:point konts[10]={point(),point(1.0,1.0,0.5),-1.0};

對於那些明顯獲得初值的元素,vec_new不再有必要了,但是對於那些沒有初始化的vec_new還是有必要。

4 new 和 delete

int *pi = new int (5);

delete pi;

變為:

int *pi;

if ( pi = _new ( sizeof (int) ) )

 *pi = 5;

if ( pi !=0)

 _delete ( pi );

假如是物件話

point3d *orgin = new point3d; è if( origin = _new (sizeof(point3d)))  origin = point3d::pointed(origin);

 

異常下:

if ( origin = _new (sizeof(point3d)))

{  try  {  origin = point3d::point3d ( origin );  }

catch (…) {  _delete (origin);  throw;  }

}

delete origin;è if (origin !=0) { point3d::~point3d(origin); _delete (origin);}

陣列new

int * p_array = new int [5];è int *p_array=(int*)_new(5*sizeof(int));

假如它不是類物件,或者類物件沒有建構函式的話 vec_new不會,只是單純地獲得釋放。

Point3d *p_array = new point3d [10]; è

Point3d *p_array;

P_array=vec_new(0,sizeof(point3d),10,&point3d::point3d,&point3d::~piont3d);

預先定義好的過載new

void * operator new ( size_t, void  *p ) { return p; }

呼叫: point *ptw = new ( arena) pont;  // 其中arena 是指向記憶體的一個區塊。

è point *ptw=(point*) arena; if(ptw != 0) ptw->point::point();

arena所表現的真正指標型別,必須指向相同型別的類,要不就是一塊新鮮記憶體,足夠容納下該型別的物件.

派生很顯然不在支援之內.

新鮮記憶體這樣而來: char *arena = new char [ sizeof ( point ) ];

相同型別的物件可以這樣獲得: point *arena = new point;

無論如何 新的pont的空間的確是覆蓋了arena的位置. 一般而言預先定義好的過載new不支援多型.

5臨時物件 

C++標準容許對於臨時物件的產生有完全的自由度

臨時物件的被摧毀,應該是對完整求值過程中最後一個步驟.該完整表示式造成臨時物件的產生.

String v= s+a+b+c; 臨時物件有: temp1=s+a; temp2=temp1+b; te=temp2+c; 在臨時物件3時 臨時物件1 雖然已經沒有什麼用了,但是要等到整個表示式完成後才可以釋放記憶體.

凡是含有表示式結果的臨時物件,應該保留到物件的初始化操作完成為止.

上面的表示式產生了3個臨時物件,在整個表示式結束後,temp1,temp2 將被釋放,temp3 要等到 v=temp3 後方可釋放.

如果一個臨時物件被繫結於個引用後,物件將保留,直到被初始化引用的生命結束,或直到臨時物件的生命範疇結束-----要看哪種情況先來而定

const string &space = a+b; 這裡的臨時物件將和space結束而結束,或者超過了生命範圍之內.

Const string &s= foo(); // point foo() { return point;}這裡的臨時物件超過了生命範圍之內.s將是錯誤的

這個條沒有對指標繫結臨時物件作出明確的解釋

const char * a=b+c+d;

        曾牧暗鯊 && 大白鯊 -8-18 

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982202/,如需轉載,請註明出處,否則將追究法律責任。

相關文章