C ++为对象分配存储而不进行初始化?

时间:2014-02-14 20:54:54

标签: c++

是否有一个被接受的习惯用于为对象分配后备存储而不是初始化它?这是我天真的解决方案:

#include <utility>

template<typename T> 
union Slot {
    T inst;

    Slot() {}
    ~Slot() {}

    template<typename... Args>
    T* init(Args&&... args) { return new(&inst) T(std::forward<Args>(args) ...); }
    void release() { inst.~T(); }
};

我的直接用例是针对对象池,但它通常也会更有用。

1 个答案:

答案 0 :(得分:4)

在C ++ 11中,您可以使用std::aligned_storagesee also):

template<typename T> 
struct Slot {
    typename std::aligned_storage<sizeof(T)>::type _storage;

    Slot() {}
    ~Slot() { 
       // check if destroyed!
       ...
    }

    template<typename... Args>
    T* init(Args&&... args) { 
        return new(address()) T(std::forward<Args>(args) ...); 
    }

    void release() { (*address()).~T(); }

    T* address()  {
        return static_cast<T*>(static_cast<void*>(&_storage));
    }
};