搜索
您的当前位置:首页正文

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

来源:吉趣旅游网

问题

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

分析

起初我认为是VS的问题,但是实际上并不是,VS为我们提供的堆栈一半只有1MB。

解决办法

解决办法1

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

解决办法2

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

解决办法3

这也是目前最优的解决办法:
VS2019默认会使用Win32作为虚拟机,对程序进行运行。

其他问题

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Top