C placement new 用法舉例

2021-05-23 12:18:44 字數 1441 閱讀 9105

在處理記憶體分配的時候, c++ 程式設計師會用 new 操作符( operator new )來分配記憶體,並用 delete 操作符( operator delete )來釋放記憶體。這是乙個 new 操作符的例子。

class ctest

;// . . . **

// 分配乙個物件

ctest * ptest = new test;

// 分配乙個有十個物件的陣列 (ctest 要有預設建構函式( default constuctor ) )

ctest * p10tests = new test[ 10];

雖然這種寫法在大多數時候都工作得很好,但還是有些情況下使用 new 是很煩人的,比如當你想重新分配乙個陣列或者當你想在預分配的記憶體上構造乙個物件的時候。

比如第一種情況,重新分配乙個陣列效率是很低的:

// 分配乙個有 10 個物件的陣列

ctest * ptests = new test[ 10];

// . . .

// 假設現在我們需要 11 個物件

ctest * pnewtests = new test[ 11];

// . . . 我們必須把原來的物件拷貝到新分配的記憶體中

for ( int i = 0; i < 10; i++)

pnewtests[ i] = ptests[ i];

delete ptests;

ptests = pnewtests;

如果你想在預分配的記憶體上建立物件,用預設的 new 操作符是行不通的。要解決這個問題,你可以用 placement new 構造。它允許你構造乙個新物件到預分配的記憶體上:

// buffer 是乙個 void 指標 (void *)

// 用方括號 括起來的部分是可選的

[cyourclass * pvalue = ] new( buffer) cyourclass[( parameters)];

下面是一些例子:

#include

class ctest

ctest( int)

{}/* ** */

};int main(int argc, char* argv)

當你有自己的記憶體緩衝區或者在你實現自己的記憶體分配策略的時候, placement new 會很有用。事實上在 stl 中廣泛使用了 placement new 來給容器分配記憶體;每個容器類都有乙個模版引數說明了構造 / 析構物件時所用的分配器( allocator )。

在使用 placement new 的時候,你要記住以下幾點:

C placement new使用簡介

在實際應用中,遇到這樣的情況 已分配好了一塊記憶體,需要在這塊記憶體上面分配乙個類物件。這時可以通過強制型別轉換,把該記憶體塊強制轉換成類物件 class a char p new char 100 a pa reinterpret cast p 但是,這樣轉換的話,類的建構函式就沒有得到呼叫,類成...

stack用法,queue用法,

stack stack 模板類的定義在標頭檔案中。stack 模板類需要兩個模板引數,乙個是元素型別,乙個容器型別,但只有元素型別是必要 的,在不指定容器型別時,預設的容器型別為deque。定義stack 物件的示例 如下 stack s1 stack s2 stack 的基本操作有 入棧,如例 s...

stack用法,queue用法,

stack stack 模板類的定義在標頭檔案中。stack 模板類需要兩個模板引數,乙個是元素型別,乙個容器型別,但只有元素型別是必要 的,在不指定容器型別時,預設的容器型別為deque。定義stack 物件的示例 如下 stack s1 stack s2 stack 的基本操作有 入棧,如例 s...