c - 从循环链表中释放 malloc 的内存

标签 c linked-list

如果这是一个非常愚蠢的问题,我提前道歉...

目前我有一个循环链表。节点数通常保持不变。当我想添加到它时,我分配了一些节点(例如 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 可能会搞砸来自仍然存在的节点的所有其他指针? ), 但是:

  1. 有人可以明确地向我解释发生了什么吗?
  2. 有没有办法按 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/

相关文章:

用于查找给定无向图中两个节点之间的所有路径的 C 代码

c - 两个链表的合并功能不起作用

在 C 中无法使用 "if"或 "else"获得 3 个不同的响应

c - 打印出堆栈指针的值

c - STATUS_ACCESS_VIOLATION 由于 malloc()?

c++ - recv() 套接字循环永远不会结束 C

c - Linked List - Stack Building - C - 这个教程是否正确

c++ - 指针列表初始化和释放内存

c - 销毁C中的链表

android - 第二个AlertDialog列表项点击基于第一个Alertdialog列表android