VS处未处理的异常 0xC0000374: 堆已损坏 malloc的一种解决方案

处未处理的异常 0xC0000374: 堆已损坏 malloc的一种解决方案

  • 问题
  • 分析
  • 解决办法
    • 解决办法1
    • 解决办法2
    • 解决办法3
  • 其他问题

问题

在使用VS的过程中,
当我们在某个函数中写malloc函数(C)或者new(C++)时,经常会出现
(ntdll.dll)(XXX.exe中)有未经处理的异常:0xC0000374堆已损坏的系统异常报错。

分析

起初我认为是VS的问题,但是实际上并不是,VS为我们提供的堆栈一半只有1MB。
1MB
查看这些参数可以直接点击项目->链接器->系统就可以看到。
但实际上1MB的控件对于下述程序是没有超范围的。
实际上因为该语句所在的函数被频繁调用,而matrixA从未被释放,所以越攒越多,导致的堆栈溢出。
malloc

解决办法

解决办法1

优秀的程序员当然是malloc后紧接着free,
可是大部分情况下,在某个函数funcA中用malloc出数组空间,
是希望供调用该函数的的外部函数使用的,怎么可能直接free掉,如果在funcA中就free,那还有什么意义?
至于有的情况下就算紧接着就free,也不能解决该堆损坏的问题。

解决办法2

看过无数别人写的大的C底层程序后,我认为如果想堆malloc出的数组进行修改再返回,还要避免堆损坏问题,就应该将malloc尽可能地写在funcA的外面,然后作为指针类参数传入funcA,这样加工结束后,malloc的数组和一般的数组不一样,不会再funcA结束时释放掉,而是会将修改后的内容保留到上一层供外层程序操作。

解决办法3

这也是目前最优的解决办法:
VS2019默认会使用Win32作为虚拟机,对程序进行运行。
Win32
而这个32位可能不足以承受大堆,所以应该修改:
VS处未处理的异常 0xC0000374: 堆已损坏 malloc的一种解决方案_第1张图片
VS处未处理的异常 0xC0000374: 堆已损坏 malloc的一种解决方案_第2张图片
这样就不会报错了。

其他问题

有的时候,VS2019自身也会有问题,比如再根据上述解决办法2修改后,调试一次没有报这个错误,再调试第二次,又会出现堆损坏。但是如果点击清理该项目并点击重新生成,又能够正常调试了。有的时候调试可以顺利进行但是运行又出问题。这些就等待官方后期更新维护吧,劝大家不要安装最新版的集成开发环境,或多或少会有问题。2017在这方面比较稳定。

你可能感兴趣的:(C语言,VS2019)