相关疑难解决方法(0)

C++ 11内存池设计模式?

我有一个程序包含一个处理阶段,需要从多态类型树中使用一堆不同的对象实例(都在堆上分配),所有这些实例最终都是从一个公共基类派生出来的.

由于实例可能循环引用彼此,并且没有明确的所有者,我希望将它们分配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

    ...
}
Run Code Online (Sandbox Code Playgroud)

除了小心所有B实例都使用new分配,并且在清除内存池后没有人使用任何指针时,这个实现是否存在问题?

具体来说,我担心在派生类构造函数完成之前,this指针用于std::unique_ptr在基类构造函数中构造a .这是否会导致未定义的行为?如果有的话有解决方法吗?

c++ memory-pool c++11

35
推荐指数
3
解决办法
4万
查看次数

标签 统计

c++ ×1

c++11 ×1

memory-pool ×1