« 疑似乱数を調べていたら、Strategy(ストラテジ)パターンがでてきた | トップページ | 配置new(placement new)を使ってみた 其の2 »

2009年9月 2日 (水)

配置new(placement new)を使ってみた 其の1

C++で動的にメモリを確保するには、new演算子を使います。つまり、

CNanika* nani = new CNanika;

というふうにしますと、必要とされる領域を確保してくれて、かつ初期化(コンストラクタの呼び出し)をしてくれるわけです。

では、普通のnewと配置newはなにが違うのでしょうか。まず配置newは、newというヘッダーファイルにオーバーロードされています。こんな感じです。

void *operator new(size_t, void *_Where)

new演算子の第一引数は、確保するサイズを指定します。そして、上記のnewには第2引数になにやらアドレスを指定するところがあります。処理内容をみますと、第2引数に指定したアドレスをそのまま返しています。これは、アドレスを指定すると、指定した場所に領域を割り当ててくれるということです。でも、指定するアドレスは、使っても良い領域じゃないと駄目ですよ。

#include <new>

unsigned char area;

int main()
{
    unsigned char* p_area = &area;
    unsigned char* p1 = new( &area ) unsigned char;
    unsigned char* p2 = new unsigned char;
    delete p2;
    return 0;
}

こんな感じのやつを作って、deleteのところで、ブレークポイントを設定して実行してみます。

090902_2


すると、p_areaとp1が一致していることが確認できます。でも、これだったらわざわざ配置newを使わなくても、p_areaみたいな使い方でいいじゃないかと。p_areaとp1は何が違うんだと。じつは、配置newを使うと、初期化(コンストラクタの呼び出し)されます。

つまり、配置newは、new演算子の通常動作から領域確保を除いたものということになるでしょうか。自分でメモリ管理を行いたいときとかに役に立ってくれるでしょう。

次回に続きます。

|

« 疑似乱数を調べていたら、Strategy(ストラテジ)パターンがでてきた | トップページ | 配置new(placement new)を使ってみた 其の2 »

C++」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 配置new(placement new)を使ってみた 其の1:

« 疑似乱数を調べていたら、Strategy(ストラテジ)パターンがでてきた | トップページ | 配置new(placement new)を使ってみた 其の2 »