【发布时间】:2013-04-29 00:02:48
【问题描述】:
我有一个程序包含一个处理阶段,该阶段需要使用来自多态类型树的一堆不同对象实例(全部在堆上分配),所有这些实例最终都派生自一个公共基类。
由于实例可能会周期性地相互引用,并且没有明确的所有者,我想用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实例都用new分配,并且在内存池被清除后没有人使用指向它们的任何指针之外,这个实现是否有问题?
我特别担心this 指针用于在派生类构造函数完成之前在基类构造函数中构造std::unique_ptr。这会导致未定义的行为吗?如果有,有什么解决方法吗?
【问题讨论】:
-
为什么
B需要知道内存池?从驱动程序代码 (main) 添加指针看起来是不可估量的可取之处。然后当然可以限制池的生命周期,这反过来意味着当它超出范围时您可以免费销毁。 -
@Jon:您的意思是用
memory_pool.emplace_back(new D(...))替换对new D(...)的调用?我想我可以编写一个make_shared风格的模板函数来构造对象,将参数转发给构造函数,并将其添加到内存池中。我还是想知道上面的代码是不是UB。 -
对于知名的 FOSS 解决方案,请查看The Boehm-Demers-Weiser conservative C/C++ Garbage Collector out。
标签: c++ c++11 memory-pool