函数执行至return 0时触发ucrtbased.dll内存异常排查
异常根源分析
核心问题:双重释放内存
你用malloc分配了img_slopes内存块,但同时调用了stbi_image_free(img_slopes)和free(img_slopes)——这属于同一内存块被重复释放。
stbi_image_free仅用于释放stb_image库自身分配的内存(比如stbi_load返回的指针),你自己用malloc分配的内存只能用free释放。- 双重释放会破坏堆内存结构,直接触发内存访问异常,这就是
return 0前崩溃的直接原因。
潜在隐患:数组越界访问
代码中多处存在未做边界检查的内存访问,会破坏堆结构或导致内存错误:
- 边缘填充时的索引计算:
(int)(Y_left_tar[l] * width + X_left_tar[l])未校验是否在0 ~ width*height-1范围内,若Y/X值超出图像尺寸,会直接越界写内存。 - 中间垂直线条:
l = 845 + tolerance或l = 574 - tolerance未校验是否在0 ~ width-1范围内,超出范围会导致j*width + l越界。 - Degrade区域的k值计算:比如
k = (int)(X_right_tar[arraysizeX_right_tar - 1]) - degrade_pixels - 1可能得到负数,导致列索引非法,越界访问内存。
修复建议
- 立即移除
stbi_image_free(img_slopes);,仅保留free(img_slopes); - 对所有像素索引添加边界校验,确保索引值在合法范围内:
int idx = (int)(Y_left_tar[l] * width + X_left_tar[l]); if (idx >=0 && idx < width*height) { *(img_slopes + idx) = 0; } - 校验垂直线条的l值:
if (l >=0 && l < width)再执行写操作 - 校验degrade区域的l和k值,确保列索引在
0 ~ width-1之间
内容的提问来源于stack exchange,提问作者ATSlooking4things
相关产品推荐
相关产品推荐

