Принуждение шаблонного объекта к созданию из указателя - PullRequest
2 голосов
/ 01 мая 2010

У меня есть вымышленный класс:

template<typename T> class demonstration
{  
    public:
    demonstration(){}
    ...
    T *m_data;
}

В какой-то момент выполнения программы я хочу установить m_data в большой блок выделенной памяти и создать там объект T.

В данный момент я использую этот код:

void construct()
{
    *m_data = T();
}

То, что я сейчас понял, вероятно, не лучшая идея ... не будет работать при определенных обстоятельствах, если, например, T имеет частный оператор присваивания.

Есть ли нормальный / лучший способ сделать то, что я пытаюсь здесь?

Ответы [ 2 ]

8 голосов
/ 01 мая 2010

Использовать размещение new:

new (m_data) T();

Размещение new - это просто перегрузка функции operator new, которая принимает дополнительный параметр - область памяти, в которой должен быть построен объект. Это точно соответствует вашему варианту использования.

В частности, именно так allocator s обычно реализует метод construct, который используется (среди прочего) классами контейнеров STL для конструирования объектов.

Поскольку размещение new только создает объект без выделения памяти, обычно вызывается delete, чтобы избавиться от памяти. Разрушение должно произойти путем прямого вызова деструктора, без освобождения памяти:

m_data->~T();

Обратите внимание, что этот синтаксис для вызова деструктора не работает для вызова конструктора, в противном случае нам не нужно было бы помещать новое в первую очередь. То есть нет m_data->T().

1 голос
/ 01 мая 2010

Размещение new Оператор - это то, что подойдет вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...