You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数执行至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:37:43