收缩动态数组时触发Visual Studio警告C6308的原因是什么?
警告C6308触发原因说明
'realloc' 可能返回空指针:若将空指针赋值给作为 'realloc' 入参的 'arr_all_guests',会造成原始内存块泄漏。
- 核心触发逻辑:
realloc无论执行扩容还是收缩操作,都存在分配失败返回NULL的可能。你当前的代码直接将realloc的返回值赋值给原指针变量arr_all_guests,一旦realloc返回NULL,原来arr_all_guests指向的有效内存地址就会被空指针覆盖,这块内存再也无法被访问或释放,直接造成内存泄漏。 - 你认为不会丢失指针的判断不符合静态分析的校验规则:Visual Studio的静态分析工具不会假设收缩场景下
realloc一定成功,它只会基于代码的逻辑分支可能性做校验,只要存在「返回NULL后覆盖原指针」的路径,就会抛出该警告。 - 你的代码还存在额外的隐藏bug:你把
--(*guest_counter)直接写在realloc的参数里,会先执行计数减1的操作再调用realloc。如果realloc调用失败,实际数组长度没有变化,但计数已经被修改,会出现计数与实际内存长度不匹配的问题,后续访问数组大概率会触发越界错误。
修复方案示例
// 先用临时指针接收realloc返回值,不直接修改原指针 char** temp = (char**)realloc(arr_all_guests, (*guest_counter - 1) * sizeof(char*)); if (temp != NULL) { // 分配成功再更新原指针和计数 arr_all_guests = temp; --(*guest_counter); } else { // 可自行添加realloc失败的错误处理逻辑 }
内容的提问来源于stack exchange,提问作者Moshe
相关产品推荐
相关产品推荐

