« 配置new(placement new)を使ってみた 其の1 | トップページ | 配置new(placement new)を使ってみた(双方向リストで) 其の3 »

2009年9月 6日 (日)

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

さて、配置newしたものに対しての後始末はどうするのでしょうか。前回のサンプルは、unsigned charで配置newを行っていますが、delete等は行っていません。そもそも、すでに確保された領域に対して割り当てを行っただけですので、領域解放を行うdeleteを呼ぶ必要がありません。

しかし、デフォルトのnewを行った場合は、領域確保を伴っていますので、deleteを呼ぶ必要があるわけです。

では、クラスの場合はどうでしょうか。領域確保を行っていないので、deleteは呼ぶ必要がない・・・というわけにはいかないのです。deleteを行わないとデストラクタが呼ばれません。じゃ、deleteを呼ばなければということになるのですが、newもしてないのに、deleteを呼んじゃいけません。

正解は、難しいことを考えずに、デストラクタを呼んでしまえば良いということです。いわゆる明示的なデストラクタの呼び出しですね。

では、簡単なサンプルを以下に示します。

#include <new>

class sample {
public:
    sample() {}
    virtual ~sample() {}
};

int main()
{
    void* top = operator new( sizeof( sample )*10 );
    sample* sample_top = static_cast<sample*>( top );
    sample* pS1 = new( &sample_top[0] ) sample;
    pS1->~sample();
    operator delete( top );
    return 0;
}

全く持って、意味のないサンプルです。簡単に説明しますと、まず、sampleクラス10個分の領域を確保し、 配置newを使って、pS1にsampleクラスの割り当てを行い、その後、デストラクタの明示的な呼び出しを行っています。最後に、sampleクラス10個分の領域を解放して終了というサンプルです。なんだか、普通にnew/deleteした方が良いんじゃないかと思いますが、まさにその通りです。

メモリ管理を自前で行うみたいなことをしない限り、あんまり出番はないかと思われます。

次回は、配置newを用いてメモリ管理を行ってみたいと思います。

|

« 配置new(placement new)を使ってみた 其の1 | トップページ | 配置new(placement new)を使ってみた(双方向リストで) 其の3 »

プログラミング」カテゴリの記事

C++」カテゴリの記事

コメント

コメントを書く



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




トラックバック


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

« 配置new(placement new)を使ってみた 其の1 | トップページ | 配置new(placement new)を使ってみた(双方向リストで) 其の3 »