关于瞎报Access violation writing location异常的瞎解决方法

关于瞎报Access violation writing location异常的瞎解决方法

本文原创,可随意探讨,转载请注明出处
[TOC]


问题描述


最近在用OpenCV解决一些CV问题。嗯,VS2017,各位看官不要笑,我也想用Linux,没办法,VS对于菜鸡来说是真的好用,虽然配环境确实蛋疼。主要是有时候需要看源码,没在Linux下看过源码,不敢乱搞,先从熟悉的开始。
好了,说正经的:我在工程里有一部分需要写一个类似种子填充一样的递归(当然啦,递归是要占用运行栈的,所以我把栈空间给改成了20MB,讲道理够了吧。。好像是够的,上一个递归就爆了stack overflow,改成20MB后no 铺绕不了木):

关于瞎报Access violation writing location异常的瞎解决方法

上面那两个箭头是我Debug用的,图像1400*1000、四通道float(不说了,为了运算方便),然后我选了Release的X64运行,OK,没毛病,经过编译器优化速度还不错。为什么选Release呢?我也忘了。可是,我选Debug运行后:(Surprise mother fk)
关于瞎报Access violation writing location异常的瞎解决方法
Bazinga!坐标[34, 688]Access violation writing location??这么秀的?于是我插个断点去看看,如上面的上面的那个图。为什么不在断点上写condition来控制断点而是用这种制杖的if?因为我试了写condition。。。速度太慢了。。我的小暴脾气。结果:
关于瞎报Access violation writing location异常的瞎解决方法
亚!麻!带!你这还换异常了?刚才还是at<>(),现在是channels()?我检查过了应该没毛病。。(可能是我太菜了,一直找不到),重新运行,结果这次报异常的坐标还变了?[25,827]换地方了?这么秀的?


解决办法


关于瞎报Access violation writing location异常的瞎解决方法

我在想是不是栈运行时候跑飞了?那应该报Stack Overflow啊。。不过试试看吧,把栈调到40M(没办法,目前偷懒,递归简单粗暴)。瞎猫捉个死耗子,居然Debug就能通了?What?这么秀的?是的,
关于瞎报Access violation writing location异常的瞎解决方法
那么问题来了,为什么我勾选Release运行时候不报异常?哪位大佬能给小弟解解疑惑?为啥我调整了栈空间就可以运行了?并没有报Stack Overflow啊?