2012-01-02 5 views
3

以下のコードのように、任意のアロケータを使用して割り当てられたプリミティブ型の配列に対してallocator.construct()を呼び出す必要がありますか?このクラスでは、割り当てられたメモリを特定の値に初期化する必要はないので、新たに割り当てられたメモリチャンクを持つallocator.construct()を呼び出す必要はありません。配列が常にプリミティブ型で構成されている場合、このメソッドを呼び出さないと危険ですか?C++プリミティブのallocator.constructを呼び出す

template <class T, template <class> class Allocator = std::allocator> 
class foo 
{ 
public: 
    typedef Allocator<T> allocator; 
    typedef typename allocator::pointer pointer; 
private: 
    unsigned size_; 
    allocator alloc_; 
    pointer t_; 
public: 
    foo(unsigned n) throw(std::bad_alloc) : size_(n), alloc_(), 
    t_(alloc_.allocate(n)) 
    { 
     // Note that I do not call alloc_.construct() here. 
    } 

    ~foo() { alloc_.deallocate(t_, size_); } 
}; 
+0

コードを記述しようとするのではなく、簡単な説明用コードを簡単に投稿する方が簡単です。 –

+0

ポストにコードサンプルを追加しました。 –

答えて

3

はい。アロケータは、既存のオブジェクトの数を含め、望むカスタムブックを自由に割り当てることができます。それは単にnew (memory) T(...)を保証するものではありません。さらに、コードを変更してもはや単なるプリミティブではなく、いつかは後でランダムに壊れることを発見するのは非常に厄介な驚きです。

+0

答えをありがとう。それは知らなかった。 –

+0

また、allocate()を使用してメモリを割り当ててからuninitialized_copy()を使用して初期化するのは安全ですか? –

+0

好奇心が強い人のために、私はこのリンクが私の質問に答えると思う:http://stackoverflow.com/questions/6047840/does-an-allocator-construct-loop-equal-stduninitialized-copy uninitialized_copyを使用してallocator.allocate()によって返されたメモリを初期化することは安全です。 –

関連する問題