具有对象指针容器的对象的内存池

时间:2018-03-06 14:55:55

标签: c++

我有一个对象定义为,

class X
{
    string name;
    map<string,string> value;
    vector<X*> ptrs;
public:
    X(const char a* ="", const char* b ="") 
    {
        value[a]=b;
    }
    ~X()
    {
        for( i = 0; i< ptrs.size();i++)
            delete ptr[i];
    }
};

int main()
{
    while( j++ < 200)
    {
        X* p = new X;
        while( i++ < 100)
        {
            X* y = new X("one","first");
            p.add(y);
        }
        delete p;
    }
}

正在进行Xptr的多次分配。

在这种情况下如何重新使用内存? 我想避免多次新建和删除调用,导致虚拟机使用率过高。

1 个答案:

答案 0 :(得分:1)

是的,您可以使用展示位置

// Allocate initial memory
X *arr = new X[number_of_elems];

for (size_t i = 0; i < number_of_elems; i++) {
  new (arr + i) X();  // Create objects in place
}

// Destroy object without deleting
arr[index].~X();

// create on that space again
new (arr + index) X();

编辑: 再次阅读你想要使用容器的问题,在这种情况下你应该使用一个使用内存池容器的自定义分配器。在这种情况下,分配器将调用该容器以根据需要为STL容器提供内存,而内存池将只执行一个大的alloc并根据需要提供内存指针(例如,它可能会增加指针,但您可能会得到如果你想从你的矢量的不同点删除对象,就会出现碎片问题。)