布局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操作符建立的對象調用解構函式.
正常情況下將自動調用解構函式,這是需要顯示調用解構函式的少數幾種情況之一。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.