我正在尝试为图上的算法动态分配内存。这是我的代码分解到问题:
typedef struct
{
int id;
int color;
} node_t;
unsigned int max_n = 2;
node_t* node_malloc = malloc(sizeof(node_t) * max_n);
node_t* nodes = node_malloc;
if(atoi(left_node) > max_n)
{
max_n = (size_t) atoi(left_node);
nodes = realloc(nodes, sizeof(node_t) * max_n);
}
对于max_n<9,realloc起作用-当max_n为9或更大时;free((:无效指针:"被抛出。
free(node_malloc);
当在发生realloc之后调用free(node_malloc(时;free((:无效的下一个大小(fast(">
谢谢你的回答!
发生的情况是,在realloc
调用之后,nodes_malloc
中的指针值不再有效。如果realloc
无法扩展当前缓冲区,它将为新的缓冲区分配空间,将旧缓冲区的内容复制到其中,然后释放旧缓冲区,这显然是当您扩展超过9个元素时会发生的情况。
使用nodes
作为realloc
调用的临时目标-如果不是NULL
(意味着realloc
成功(,则将其分配回nodes_malloc
:
nodes = realloc( nodes_malloc, sizeof *nodes * max_n );
if ( nodes )
{
nodes_malloc = nodes;
}
else
{
// realloc failed
}
你有这个:
node_t* node_malloc = malloc(sizeof(node_t) * max_n);
node_t* nodes = node_malloc;
之后,指针node_malloc
和nodes
都指向同一存储器。
但在第一次呼叫realloc
之后,就不再保证了。事实上,几乎可以肯定的是,nodes
将指向其他地方,而node_malloc
指针将无效。
尝试free(node_malloc)
将导致未定义的行为。
在相关问题上,永远不应该将指针分配回传递给realloc
的指针。如果realloc
失败,它将返回NULL
,但旧的内存分配将保持有效。如果重新分配回同一个指针,则会丢失原始内存并导致内存泄漏。始终使用临时变量,并检查是否存在故障(NULL
(。