C语言mallocKillList释放内存触发访问违例错误求助
内存统一释放触发访问违例的排查与修复
错误原因分析
触发的错误0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF,说明你尝试释放的是无效指针:
- 该地址是
-1的无符号表示,大概率是mallocKillList中存储了错误值(比如未初始化的指针、已手动释放过的野指针、或指针被意外覆盖为0xFFFFFFFFFFFFFFFF) - 也可能是
mallocKillList自身的内存管理出问题,比如数组越界、扩容失败导致存储的指针数据被破坏
排查与修复步骤
1. 校验mallocKillList的指针添加逻辑
- 确保每次调用
malloc/calloc/realloc后,仅将非NULL的有效指针添加到列表,禁止添加未初始化或无效的指针值 - 检查是否存在重复添加同一指针的情况,重复释放会直接导致指针变为野指针
- 确认列表扩容逻辑正确:当数组满额时,必须用
realloc完成扩容,避免越界写入破坏已存储的指针数据
2. 修正mallocDestroyer的循环释放逻辑
- 不要直接操作列表首元素后就移动数组,先过滤无效指针再释放,示例逻辑如下:
// 假设killListCount是mallocKillList的元素数量 for (int i = 0; i < killListCount; i++) { void* curr_ptr = mallocKillList[i]; // 过滤明显无效的指针 if (curr_ptr != NULL && curr_ptr != (void*)0xFFFFFFFFFFFFFFFF) { free(curr_ptr); mallocKillList[i] = NULL; // 标记已释放,避免后续误操作 } } // 最后释放mallocKillList自身 free(mallocKillList); mallocKillList = NULL; killListCount = 0; - 若你用的是“释放首元素后前移数组”的逻辑,需检查索引计算是否正确,避免访问超出数组范围的内存
3. 禁止手动释放已加入列表的指针
- 统一内存管理的核心是所有动态分配内存只能通过
mallocDestroyer释放,若程序中存在手动free已加入列表的指针的操作,会导致列表中留存野指针,触发二次释放错误
4. 增加调试日志定位问题
- 在添加指针到列表和释放指针时打印地址,快速定位异常点:
通过日志可直接观察是否有无效指针被添加、或重复释放的情况// 添加指针时打印 printf("Add to kill list: %p\n", new_allocated_ptr); // 释放指针时打印 printf("Freeing pointer: %p\n", curr_ptr);
内容的提问来源于stack exchange,提问作者Christian Phillips
相关产品推荐
相关产品推荐

