2014-02-14 1 views
3

Есть ли принятая идиома для выделения хранилища резервных копий для объекта на месте, но не для его инициализации? Вот мое наивное решение: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(); } 
}; 

Мой непосредственный случай использования для объекта пула, но он также будет более полезным в целом.

+0

Я думаю, что вы хотите, называется [размещение новых] (http://en.wikipedia.org/wiki/Placement_syntax). – TypeIA

+0

@ dvnrrs Он использует размещение нового. Этот код выглядит хорошо для меня. – user3286380

+0

@ пользователь3286380 действительно ... извините. Я не очень внимательно смотрел на код. Тогда в чем вопрос? Существует много способов выделения памяти. – TypeIA

ответ

4

В C++ 11 вы можете использовать std::aligned_storage (see 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)); 
    } 
}; 
+0

Baller! Цель прямо там в названии! – Max

+0

@Max Обратите внимание, что этот класс в его нынешнем виде может быть опасен для использования! Вы должны сделать ее более безопасной и удобной в использовании;) – CouchDeveloper

+0

Это, по крайней мере, частный внутренний тип, поэтому в принципе опасность скрывается за интерфейсом. – Max

Смежные вопросы