如果这是一个非常愚蠢的问题,我提前道歉...
目前我有一个循环链表。节点数通常保持不变。当我想添加到它时,我分配了一些节点(例如 100000 左右)并将其拼接。当我一个一个地分配节点时,这部分工作正常。
我想尝试按 block 分配:
NODE *temp_node = node->next;
NODE *free_nodes = malloc( size_block * sizeof( NODE ) );
node->next = free_nodes;
for ( i = 0; i < size_block - 1; i++ ) {
free_nodes[i].src = 1;
free_nodes[i].dst = 0;
free_nodes[i].next = &free_nodes[i+1];
}
free_nodes[size_block - 1].next = temp_node;
只要我不尝试释放任何东西('glibc detected: double free or corruption' 错误),该列表就有效。直觉上,我认为这是因为释放它并没有释放单个节点,并且通过正常方式循环试图多次释放它(加上释放整个 block 可能会搞砸来自仍然存在的节点的所有其他指针? ), 但是:
- 有人可以明确地向我解释发生了什么吗?
- 有没有办法按 block 分配节点而不破坏东西?
这样做的目的是因为我调用了 malloc 数十万次,如果速度更快就好了。如果有更好的方法解决这个问题,或者我不能期望它变得更快,我也很乐意听到。 :)
最佳答案
Could somebody please explain to me explicitly what is happening?
你说的没错。您正在为所有 block 分配单个连续内存空间。然后如果你释放它,所有的内存都会被释放。
Is there a way to allocate the nodes by blocks and not break things?
为每个 block 分配不同的内存段。在您的代码中(不完整)应该是这样的:
for ( i = 0; i < size_block ; i++ ) {
free_nodes[i] = malloc (sizeof( NODE ));
}
关于c - 从循环链表中释放 malloc 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7536449/