清理链接对象的动态内存

时间:2013-03-18 13:00:00

标签: c++ linked-list dynamic-memory-allocation

我需要清理链接对象的动态内存。我正在研究分支机构优化问题的约束算法。我有一个名为“节点”的类,它保存部分解决方案的数据。我使用“new”函数创建节点。所有创建的节点都相互链接,形成一个链,就像我创建了一个manuel列表。每个节点都知道其后的最佳节点的物理地址。这条链是动态的。使用现有节点,我生成新节点并相应地将它们链接到链,直到找到最佳解决方案。对于某些问题,当节点数量约为30亿(30-40 GB)时,我找到了最佳解决方案。我设置我的代码来解决下一个问题,当它完成解决一个问题时(我在处理期间通过多个文件流进行处理)。在传递解决另一个问题之前,我需要释放内存。当我找到最佳时,我尝试使用“删除”功能,当我不再需要节点链时。糟糕的是删除相互链接的30亿个节点对象需要数小时。我正在终止程序,从目录中删除已解决的文件,等待Windows释放RAM,然后再次重新启动它继续我的工作。 有没有办法释放内存,同时传递另一个问题来解决,如终止过程所做的清理操作,还是应该更改节点链的结构?

3 个答案:

答案 0 :(得分:3)

听起来像是一个自定义新作业的作业,它可以从一个可以解除分配的池中分配。

class Node
{
    void* operator new(size_t bytes);
    void delete(void* ptr) {}
    ...
};

现在您的操作员可以执行此操作

char* big_block = new char[100000];
char* free_ptr = big_block;

void* Node::operator new(size_t bytes)
{
    char* ptr = free_ptr;
    free_ptr += bytes;
    return ptr;
}

然后,当你完成后,你可以打电话给delete[] big_block;并释放所有的记忆。无论如何都是这样的。有一些细节需要补充。

答案 1 :(得分:2)

如果你有30亿个对象,你需要释放30亿个对象。除非你作弊。

正如你已经正确指出的那样,一种欺骗方式就是杀死这个过程。当然,这会排除事后做其他事情。

另一种方法是重载operator new以使用块分配器而operator delete不执行任何操作(或完全忘记operator delete)。块分配器将分配一个巨大的块(或者可能需要多个块,这些块可以在链表中),从中分配您分配的对象。这可以以相对简单的方式实现(从数组返回一个元素,并递增索引)。

然后,当你完成了30亿个对象时,在块分配器中调用一个函数,它只是一次抛出整个块(释放它们)。分配器不知道30亿个对象并且不关心。所有这一切都是一个(或者3-4个)大的解除分配。

答案 2 :(得分:0)

使用析构函数释放构造函数分配的资源,或者由mutator分配的其他资源。