C语言realloc扩容结构体数组后free旧内存触发断点问题求助
问题核心原因
- 重复释放内存:
realloc函数执行成功时,会自动释放你传入的旧内存块(也就是*pitemList指向的内存),你代码中在realloc成功后又手动调用free(*pitemList),属于非法的重复释放操作,直接触发了系统内存检测的断点,是你报错的直接原因。 - 无意义的死循环:你写的
do{}while(temp == NULL)逻辑没有任何退出路径,如果系统内存不足导致realloc持续返回NULL,程序会永久卡死在这个循环中,合理的做法是分配失败时返回错误标识给上层调用者处理。 - 多余的判断逻辑:
if(listLength!=0)这个判断完全没必要,就算listLength是0,只要realloc成功旧内存也会被自动处理,不需要你额外判断。
修正后的代码实现
// 函数返回值改为int,0表示成功,-1表示分配失败 int addSpace(struct GroceryItem** pitemList, int listLength) { int newSize = listLength + 1; struct GroceryItem * temp = realloc(*pitemList, newSize * sizeof(struct GroceryItem)); // 分配失败直接返回错误,不要死循环 if (temp == NULL) { return -1; } // realloc成功直接赋值即可,不需要手动释放旧内存 *pitemList = temp; _CrtDumpMemoryLeaks(); return 0; }
额外注意事项
如果后续要实现缩容逻辑,也直接调用 realloc 传入更小的容量即可,依旧不需要手动释放旧内存,realloc 会自动处理内存块的保留、拷贝、释放操作。
内容的提问来源于stack exchange,提问作者Wiken
相关产品推荐
相关产品推荐

