关于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的值。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值