布局new操作符
來源:互聯網
上載者:User
通常,new負責在堆(heap)中找到一個足以滿足需要的記憶體塊。
new操作符還有另一種變體,被稱為布局new操作符,能夠讓你指定要使用的位置。程式員可以利用這種
要使用布局new特性,首先要包含標頭檔new,他提供了這種new操作的原型。
const int BUF = 512 ;
class JustTesting
{
public :
JustTesting( const string & s = " Just Testing " , int n = 0 ){...}
~ JustTesting() {...}
} ;
int main()
{
char * buffer = new char [BUF];
JustTesting * pc1, * pc2, * pc3, * pc4;
pc1 = new (buffer) JustTesting;
pc2 = new JustTesting( " Heap1 " , 20 );
pc3 = new (buffer + sizeof (JustTesting)) JustTesting( " Bad Idea " , 6 ); // 此處用一個JustTesging對象大小的位移量避免pc3與pc1佔用同一塊記憶體
pc4 = new JustTesting( " Heap2 " , 10 )
delete pc2;
delete pc4;
pc3->~JustTesting();
pc1->~JustTesting();
delete [] buffer;
return 0 ;
}
以上代碼片斷中,pc1和pc3為布局new操作符來分配記憶體,而pc2和pc4為常規new操作符來分配記憶體 。
對於常規new操作符分配的記憶體,可以直接使用:delete pc2; 這樣的語句操作來釋放記憶體。
而 對於布局new操作符分配的記憶體就不能這樣做:delete pc1;
以上的代碼確實釋放了buffer:delete [] buffer;
但是由此產生了新的問題, 它沒有為布局new操作符在該記憶體塊中建立的對象調用解構函式
那麼這裡就 需要我們顯式的為布局new操作符建立的對象調用解構函式.
正常情況下將自動調用解構函式,這是需要顯示調用解構函式的少數幾種情況之一。