У меня есть программа, которая содержит фазу обработки, которая должна использовать кучу разных экземпляров объектов (все выделенные в куче) из дерева полиморфных типов, все из которых в конечном итоге получены из общего базового класса.
Поскольку экземпляры могут циклически ссылаться друг на друга и не иметь ясного владельца, я хочу выделить их с помощью new
, обработать их с помощью необработанных указателей и оставить их в памяти для фазы (даже если они не будут отменены), а затем после фазы программы, которая использует эти экземпляры, я хочу удалить их все сразу.
Как я думал, чтобы структурировать это:
struct B; // common base class
vector<unique_ptr<B>> memory_pool;
struct B
{
B() { memory_pool.emplace_back(this); }
virtual ~B() {}
};
struct D : B { ... }
int main()
{
...
// phase begins
D* p = new D(...);
...
// phase ends
memory_pool.clear();
// all B instances are deleted, and pointers invalidated
...
}
Помимо того, что все экземпляры B выделены новым и что никто не использует никаких указателей на них после очистки пула памяти, существуют ли проблемы с этой реализацией?
В частности, меня беспокоит то, что указатель this
используется для построения std::unique_ptr
в конструкторе базового класса до завершения конструктора производного класса. Это приводит к поведению undefined? Если это так, обходной путь?