我有一个包含一个处理阶段的程序,该阶段需要使用来自多态类型树的一堆不同的对象实例(全部在堆上分配),所有这些最终都派生自一个公共基类。
由于实例可能周期性地相互引用,并且没有明确的所有者,我想分配它们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
指针用于在基类构造函数中构造 a 。std::unique_ptr
这会导致未定义的行为吗?如果是这样,有解决方法吗?