Как сбросить класс, используя размещение delete / new из шаблона?
-
20-08-2019 - |
Вопрос
У меня есть класс шаблона менеджера пула.Когда объект класса будет добавлен обратно в менеджер пула, я хотел бы вернуть его в исходное состояние.Я хотел бы вызвать деструктор размещения и конструктор размещения для него, чтобы он был полностью сброшен в следующий раз, когда его выдаст менеджер пула.Я перепробовал много способов заставить это работать, но я в тупике.Вот пример того, что я пробовал.
template <class T>
void PoolClass<T>::ReleaseToPool(T *obj)
{
obj->~T(); //call destructor
obj->T::T(); //call constructor
//also tried new (obj)T(); //but this doesn't seem to work either
//then misc code to add a pointer to the object
//to my list of available objects for re-use later
}
Я перепробовал кучу разных синтаксисов, но, похоже, ни один из них не работает.Сам код является кроссплатформенным, поэтому должен компилироваться с использованием gcc (под mingw, linux или mac), а для Windows я все еще использую vs 2003.
Решение
Как насчет:
template <class T>
void PoolClass<T>::ReleaseToPool(T *obj)
{
obj->~T(); //call destructor
obj = new ((void *)obj)T(); //call constructor
// add a pointer to the object to the list...
}
Другие советы
Boost имеет Бассейн библиотека.Возможно, было бы проще просто использовать их вместо того, чтобы писать свои собственные.