Как сбросить класс, используя размещение delete / new из шаблона?

StackOverflow https://stackoverflow.com/questions/488874

  •  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 имеет Бассейн библиотека.Возможно, было бы проще просто использовать их вместо того, чтобы писать свои собственные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top