头大了,在Doc类的onopendocument中无法使用messagebox,大家帮忙找原因啊附代码解决办法
头大了,在Doc类的onopendocument中无法使用messagebox,大家帮忙找原因啊,附代码
问题陈述:
项目背景:
使用opencv,以及unicode,打开图像后进入onopendocument,
使用了拆分窗口。
onopendocument代码如下
编译是没有问题的,但是一旦debug就不成了,一开始我还以为是由于unicode造成的,后来提示告诉我,**.exe触发了断点,跟进断点,发现为dbgrptt.c的
这是因为什么做成的呢?百思不得其解,请高手出主意解决
------解决方案--------------------
你那malloc申请的内存没有释放
你把messagebox换成afxmessagebox看看
------解决方案--------------------
应该是这个程序的某个地方跟这个messagebox会产生冲突
出现断言的时候,点击重试可以大概定位
以前也曾将碰到过,当时是由于设置定时器产生的,
afxmessagebox也不可以用,不知道你这边可用不?
------解决方案--------------------
不要怀疑messagebox了,这个是绝对不会有问题
一般相当变态的问题,大多数是其他地方的内存越界引起的,这是检查的重点
------解决方案--------------------
注意new出来的对象问题,尤其注意ondraw里面的。
------解决方案--------------------
vvvvvvvvvvvvvvvvvvvvvvv
------解决方案--------------------
直觉好像是,你的程序某处那里有申请内存,但是访问越界,并且删除这段内存导致。
越界有时候并不是会直接Crash。
------解决方案--------------------
那是什么问题产生的??
------解决方案--------------------
------解决方案--------------------
不会是手工调用OnDraw而此时窗口还没初始化完成吧?
------解决方案--------------------
什么问题,分享一下吧
问题陈述:
项目背景:
使用opencv,以及unicode,打开图像后进入onopendocument,
使用了拆分窗口。
onopendocument代码如下
- C/C++ code
BOOL CCV_ExplorerDoc::OnOpenDocument(LPCTSTR lpszPathName) { /*if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE;*/ // TODO: Add your specialized creation code here //需要把unicode转化为char*,以使得cv中的函数可以正确调用 const int BUFSIZE = 256; size_t i; char *filename = (char *)malloc( BUFSIZE ); wcstombs_s(&i, filename, (size_t)BUFSIZE, lpszPathName, (size_t)BUFSIZE ); DeleteContents(); BeginWaitCursor(); m_img = cvLoadImage(filename,1); if (m_img == NULL) { m_csImg = CSize(0,0); m_bImgReady = FALSE; //下面的这个消息box一旦运行就会出错误,当然,注释掉运行就不会出错,错误报告为触发了断点 MessageBox(NULL,_T("这不是一个有效的图像文件"),_T("系统警告"),MB_OK); return FALSE; } m_csImg = CSize(m_img->width,m_img->height); m_bImgReady = TRUE; EndWaitCursor(); SetPathName(lpszPathName); SetModifiedFlag(TRUE); //下面的消息框运行会出错误,如果注释掉就不会debug出问题,这里的是测试用 MessageBox(NULL,NULL,NULL,MB_OK); UpdateAllViews(NULL,0L,NULL); return TRUE; }
编译是没有问题的,但是一旦debug就不成了,一开始我还以为是由于unicode造成的,后来提示告诉我,**.exe触发了断点,跟进断点,发现为dbgrptt.c的
- C/C++ code
/*** *void _CrtDebugBreak - call OS-specific debug function * *Purpose: * call OS-specific debug function * *Entry: * *Exit: * *Exceptions: * *******************************************************************************/ #undef _CrtDbgBreak /* These methods don't need a separate wchar version. Hence they need to be compiled only once from the original file */ _CRTIMP void _cdecl _CrtDbgBreak( void ) { DebugBreak(); }
这是因为什么做成的呢?百思不得其解,请高手出主意解决
------解决方案--------------------
你那malloc申请的内存没有释放
你把messagebox换成afxmessagebox看看
------解决方案--------------------
应该是这个程序的某个地方跟这个messagebox会产生冲突
出现断言的时候,点击重试可以大概定位
以前也曾将碰到过,当时是由于设置定时器产生的,
afxmessagebox也不可以用,不知道你这边可用不?
------解决方案--------------------
不要怀疑messagebox了,这个是绝对不会有问题
一般相当变态的问题,大多数是其他地方的内存越界引起的,这是检查的重点
------解决方案--------------------
注意new出来的对象问题,尤其注意ondraw里面的。
------解决方案--------------------
vvvvvvvvvvvvvvvvvvvvvvv
------解决方案--------------------
直觉好像是,你的程序某处那里有申请内存,但是访问越界,并且删除这段内存导致。
越界有时候并不是会直接Crash。
------解决方案--------------------
那是什么问题产生的??
------解决方案--------------------
------解决方案--------------------
不会是手工调用OnDraw而此时窗口还没初始化完成吧?
------解决方案--------------------
什么问题,分享一下吧