本文主要是介绍关于OpenCV程序运行结束时的异常中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
2019年4月11日:由于本人最近需要用MFC开发,所以看了孙鑫的书(VC++深入详解),第92页有一句话可能与这个异常有关,所以要记录一下!原文如下:
C++窗口类对象和窗口并不是一回事,它们之间唯一的关系是C++窗口类对象内部定义了一个窗口的句柄变量,保存了与这个C++窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否结束。但C++窗口类对象销毁时,与之相关的窗口也将销毁。
由于水平有限,并不熟悉C++,只能做出如下猜测:当如我们手动关闭窗口相当于窗口的句柄被销毁了(句柄的作用或者说生命结束了),但是这个窗口的对象的生命周期并没有结束。所以当程序再次访问对象时,找不到对应的窗口句柄,就出现了异常。
本次就记录这些,如果以后有新的发现再更新!
哎,能力有限,这个问题一直放在心上,强迫症表示要被逼死了。只能走一步看一步了。。。
补充:本人最近刚买了一台全新的电脑。重新配置OpenCV3,使用的是VS2017,同样遇到了以下情况,使用的解决方法依旧是在程序结束时关闭所有的窗口,即使用destroyAllWindows()解决了问题。可能此方法不适用所有人,但是试一试总是好的,由于最近几乎不使用OpenCV,具体原因可能要以后找出来。如果有知道的朋友欢迎回复哦!
在使用OpenCV3和vs 2015过程中:
当调用namedWindow()或者imshow()函数之后,不进行手动释放,在程序运行结束时,会出现下面这些异常中断:
1.以下为waitKey(1000)与waitKey(0)之后的结果:
0x00007FFAD7990DC0 (ntdll.dll)处(位于 test.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000010 时发生访问冲突。
程序“[4180] test.exe”已退出,返回值为 0 (0x0)。
2.当手动关闭控制台后的结果:
线程 0x1874 已退出,返回值为 1 (0x1)。
线程 0x3058 已退出,返回值为 0 (0x0)。
线程 0x2e44 已退出,返回值为 1 (0x1)。
线程 0x17c4 已退出,返回值为 1 (0x1)。
线程 0x2414 已退出,返回值为 1 (0x1)。
线程 0x734 已退出,返回值为 0 (0x0)。
线程 0x2834 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x31bc 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x1190 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x2c38 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x3cec 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x3eb4 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x3c90 已退出,返回值为 -1073741510 (0xc000013a)。
线程 0x3300 已退出,返回值为 -1073741510 (0xc000013a)。
程序“[5168] test.exe”已退出,返回值为 -1073741510 (0xc000013a)。
以上两种情况程序都不是正常结束!
3.当在waitKey(1000)之后加入destroyAllWindows()函数后:
线程 0x3c3c 已退出,返回值为 0 (0x0)。
线程 0xf84 已退出,返回值为 0 (0x0)。
线程 0x2754 已退出,返回值为 0 (0x0)。
线程 0x1c68 已退出,返回值为 0 (0x0)。
线程 0xadc 已退出,返回值为 0 (0x0)。
线程 0x11e8 已退出,返回值为 0 (0x0)。
线程 0x2ce4 已退出,返回值为 0 (0x0)。
程序“[9244] test.exe”已退出,返回值为 0 (0x0)。
程序正常退出!
4.值得注意的是,不管在那种情况下,直接关闭控制台来退出程序,程序很可能会返回一个不是0的值。
这篇关于关于OpenCV程序运行结束时的异常中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!