我需要清理链接对象的动态内存。我正在研究优化问题的分支定界算法。我有一个名为“节点”的类,它保存部分解决方案的数据。我使用“新”功能创建节点。所有创建的节点都相互链接,形成一个链,就像我创建了一个手动列表一样。每个节点都知道紧随其后的最佳节点的物理地址。这个链条是动态的。使用现有节点,我生成新节点并将它们相应地链接到链,直到找到最佳解决方案。对于一些问题,当节点数量约为 30 亿(30-40 GB)时,我找到了最佳解决方案。我将我的代码设置为通过解决下一个问题,当它完成解决一个问题时(我通过在处理过程中的多个文件流来做到这一点)。我需要在通过解决另一个问题之前释放内存。当我找到最佳且不再需要节点链时,我尝试使用“删除”功能。坏事是删除 30 亿个相互链接的节点对象需要几个小时。我正在终止程序,从目录中删除已解决的文件,等待 Windows 释放 RAM,然后再次重新启动以继续我的工作。有没有办法释放内存,同时传递给另一个问题来解决,比如终止进程所做的清理操作,或者我应该改变节点链的结构?从目录中删除已解决的文件,等待 Windows 释放 RAM,然后再次重新启动以继续我的工作。有没有办法释放内存,同时传递给另一个问题来解决,比如终止进程所做的清理操作,或者我应该改变节点链的结构?从目录中删除已解决的文件,等待 Windows 释放 RAM,然后再次重新启动以继续我的工作。有没有办法释放内存,同时传递给另一个问题来解决,比如终止进程所做的清理操作,或者我应该改变节点链的结构?
问问题
125 次
3 回答
3
听起来像是从您可以解除分配的池中分配的自定义新的工作。
class Node
{
void* operator new(size_t bytes);
void delete(void* ptr) {}
...
};
现在你的 operator new 可以做到这一点
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;
并释放你所有的内存。反正是这样的。有一些细节要补充。
于 2013-03-18T13:14:23.647 回答
2
如果你有 30 亿个对象,你需要释放 30 亿个对象。除非你作弊。
正如您已经正确指出的那样,一种作弊方法是终止进程。当然,这排除了之后做其他事情。
另一种方法是重载operator new
以使用块分配器并且operator delete
什么都不做(或完全忘记operator delete
)。块分配器将分配一个巨大的块(或者根据需要分配几个块,这些块可能在链表中),从中提取您分配的对象。这可以以相对简单的方式实现(从数组中返回一个元素,并增加索引)。
然后,当您处理完 30 亿个对象后,在块分配器中调用一个函数,该函数一次简单地丢弃整个块(释放它们)。分配器不知道这 30 亿个对象,也不关心。它所做的只是一次(或者可能是 3-4 次)大型释放。
于 2013-03-18T13:14:37.277 回答
0
使用析构函数来释放由构造函数分配的资源,或由 mutators 分配的额外资源。
于 2013-03-18T13:02:17.797 回答