我的MFC程序一运行到exitfind函数 mfc就异常

如上图所示,求解释!
我就运行MFC生成的exe文件,然后什么都没做,点击关闭按钮退出界面,结果就出现上图所示情况!
运行exe文件时,从ini配置文件中读出数据,显示在对应的界面框框中。
关闭exe文件时,将界面上的数据保存到ini文件中,以及一些释放。
回复讨论(解决方案)
检查下析构函数等里指针的访问是否有问题
检查下析构函数等里指针的访问是否有问题
OnClose(MFC关闭响应函数)
和所有有关的析构函数
OnClose(MFC关闭响应函数)
和所有有关的析构函数
检查下析构函数等里指针的访问是否有问题
检查下析构函数等里指针的访问是否有问题
析构函数,我觉得我程序上应该不存在指针的访问问题!
析构函数里,都是系统自动生成的,我没去修改,以及添加任何命令。
CRO2TestDlg::~CRO2TestDlg()
然后onclose函数里,如下图所示,其实就很简单的,可是,就是不懂哪里出了问题,界面关闭完,就出现错误提示。。。
退出的时候在onclose那设断点试试,&或者你有没有onDestory()函数.&窗口销毁有资源没有释放会引起内存泄漏
退出的时候在onclose那设断点试试,&或者你有没有onDestory()函数.&窗口销毁有资源没有释放会引起内存泄漏
我在onclose中设置断点,都是结束onclose时,继续F5的时候,就出现异常(正常应该是关闭程序)。
我没有用到onDestory()函数
这种问题多为析构顺序引起,或者发生在多线程未能正常停止的情况下,建议如下:
(1)根据构造顺序,反向进行析构;
(2)析构函数中,将指针类型的对象删除后,赋值为NULL;
(3)加入minidump,直接查出出错的地方。
关闭的时候,某些对象先释放,导致后面的对象无法访问。
楼主单步调试下看看在哪里报的错。
关闭的时候,某些对象先释放,导致后面的对象无法访问。
楼主单步调试下看看在哪里报的错。
单步调试的话,onclose中一直进行到最后一个“}”,如下图所示,继续点击F5,便跳出异常
这种问题多为析构顺序引起,或者发生在多线程未能正常停止的情况下,建议如下:
(1)根据构造顺序,反向进行析构;
(2)析构函数中,将指针类型的对象删除后,赋值为NULL;
(3)加入minidump,直接查出出错的地方。
是这样的,析构函数我全用的是VS2005添加界面时,自动生成的,没有去修改过。我猜想,应该不会是我析构函数出现问题所致吧!
你说的第三点,不太会用
关闭的时候,某些对象先释放,导致后面的对象无法访问。
楼主单步调试下看看在哪里报的错。
单步调试的话,onclose中一直进行到最后一个“}”,如下图所示,继续点击F5,便跳出异常
还有个笨方法,那就是注释代码。注释掉一些代码,编译后在看有没有问题,这种方法比较耗费时间。
请用exit(1);退出。
请用exit(1);退出。
单步调试的时候,执行到最后个‘}’时,按F5就调到‘crtext.c&里头的如上图那一行(声明下“crtext.c”不是我写的)
2767:&exit(1);
2773:&exit(1);
exit,&_exit
Terminate&the&calling&process&after&cleanup&(exit)&or&immediately&(_exit).
void&exit(&int&status&);
void&_exit(&int&status&);
Function&Required&Header&Compatibility&
exit&&process.h&&or&&stdlib.h&&ANSI,&Win&95,&Win&NT&
_exit&&process.h&&or&&stdlib.h&&Win&95,&Win&NT&
For&additional&compatibility&information,&see&Compatibility&in&the&Introduction.
LIBC.LIB&Single&thread&static&library,&retail&version&
LIBCMT.LIB&Multithread&static&library,&retail&version&
MSVCRT.LIB&Import&library&for&MSVCRT.DLL,&retail&version&
Return&Value
Exit&status
The&exit&and&_exit&functions&terminate&the&calling&process.&exit&calls,&in&last-in-first-out&(LIFO)&order,&the&functions&registered&by&atexit&and&_onexit,&then&flushes&all&file&buffers&before&terminating&the&process.&_exit&terminates&the&process&without&processing&atexit&or&_onexit&or&flushing&stream&buffers.&The&status&value&is&typically&set&to&0&to&indicate&a&normal&exit&and&set&to&some&other&value&to&indicate&an&error.
Although&the&exit&and&_exit&calls&do&not&return&a&value,&the&low-order&byte&of&status&is&made&available&to&the&waiting&calling&process,&if&one&exists,&after&the&calling&process&exits.&The&status&value&is&available&to&the&operating-system&batch&command&ERRORLEVEL&and&is&represented&by&one&of&two&constants:&EXIT_SUCCESS,&which&represents&a&value&of&0,&or&EXIT_FAILURE,&which&represents&a&value&of&1.&The&behavior&of&exit,&_exit,&_cexit,&and&_c_exit&is&as&follows.
Function&Description&
exit&Performs&complete&C&library&termination&procedures,&terminates&the&process,&and&exits&with&the&supplied&status&code.&
_exit&Performs&“quick”&C&library&termination&procedures,&terminates&the&process,&and&exits&with&the&supplied&status&code.&
_cexit&Performs&complete&C&library&termination&procedures&and&returns&to&the&caller,&but&does&not&terminate&the&process.&
_c_exit&Performs&“quick”&C&library&termination&procedures&and&returns&to&the&caller,&but&does&not&terminate&the&process.&
/*&EXITER.C:&This&program&prompts&the&user&for&a&yes
&*&or&no&and&returns&an&exit&code&of&1&if&the
&*&user&answers&Y&or&y;&otherwise&it&returns&0.&The
&*&error&code&could&be&tested&in&a&batch&file.
#include&&conio.h&
#include&&stdlib.h&
void&main(&void&)
&&&_cputs(&&Yes&or&no?&&&);
&&&ch&=&_getch();
&&&_cputs(&&\r\n&&);
&&&if(&toupper(&ch&)&==&'Y'&)
&&&&&&exit(&1&);
&&&&&&exit(&0&);
Process&and&Environment&Control&Routines
See&Also&&&abort,&atexit,&_cexit,&_exec&Function&Overview,&_onexit,&_spawn&Function&Overview,&system
TerminateProcess
The&TerminateProcess&function&terminates&the&specified&process&and&all&of&its&threads.&
BOOL&TerminateProcess(
&&HANDLE&hProcess,&//&handle&to&the&process
&&UINT&uExitCode&&&//&exit&code&for&the&process
Parameters
Handle&to&the&process&to&terminate.&
Windows&NT:&The&handle&must&have&PROCESS_TERMINATE&access.&
uExitCode&
Specifies&the&exit&code&for&the&process&and&for&all&threads&terminated&as&a&result&of&this&call.&Use&the&GetExitCodeProcess&function&to&retrieve&the&process's&exit&value.&Use&the&GetExitCodeThread&function&to&retrieve&a&thread's&exit&value.&
Return&Values
If&the&function&succeeds,&the&return&value&is&nonzero.
If&the&function&fails,&the&return&value&is&zero.&To&get&extended&error&information,&call&GetLastError.&
The&TerminateProcess&function&is&used&to&unconditionally&cause&a&process&to&exit.&Use&it&only&in&extreme&circumstances.&The&state&of&global&data&maintained&by&dynamic-link&libraries&(DLLs)&may&be&compromised&if&TerminateProcess&is&used&rather&than&ExitProcess.&
TerminateProcess&causes&all&threads&within&a&process&to&terminate,&and&causes&a&process&to&exit,&but&DLLs&attached&to&the&process&are&not&notified&that&the&process&is&terminating.&
Terminating&a&process&causes&the&following:&
All&of&the&object&handles&opened&by&the&process&are&closed.&
All&of&the&threads&in&the&process&terminate&their&execution.&
The&state&of&the&process&object&becomes&signaled,&satisfying&any&threads&that&had&been&waiting&for&the&process&to&terminate.&
The&states&of&all&threads&of&the&process&become&signaled,&satisfying&any&threads&that&had&been&waiting&for&the&threads&to&terminate.&
The&termination&status&of&the&process&changes&from&STILL_ACTIVE&to&the&exit&value&of&the&process.&
Terminating&a&process&does&not&cause&child&processes&to&be&terminated.&
Terminating&a&process&does&not&necessarily&remove&the&process&object&from&the&system.&A&process&object&is&deleted&when&the&last&handle&to&the&process&is&closed.&
Windows&CE:&Windows&CE&does&not&support&exit&codes&for&processes,&so&the&uExitCode&parameter&is&ignored.
&&Windows&NT:&Requires&version&3.1&or&later.
&&Windows:&Requires&Windows&95&or&later.
&&Windows&CE:&Requires&version&1.0&or&later.
&&Header:&Declared&in&winbase.h.
&&Import&Library:&Use&kernel32.lib.
Processes&and&Threads&Overview,&Process&and&Thread&Functions,&ExitProcess,&OpenProcess,&GetExitCodeProcess,&GetExitCodeThread&
回复15、16楼:你说的exit()情况,我都试过了!只要单步执行,一执行到exit,就出现如我前面所截图的情况(见14楼)
system(&taskkill&/IM&RO2Test.exe&);
不要企图优雅的结束(因为这是不可能办到的)
而要在烂的不能再烂的摊子上也能重整河山!
楼主直接关机或拔电,我就不信你的程序还能弹出什么对话框!
楼主你实在想浪费一大截生命,追求相对比较优雅的退出的话,
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call&Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
啃《Windows核心编程》
提醒:多线程程序退出,该加锁的加锁,该WaitForSingleObject的WaitForSingleObject
我觉得最后2行代码可能有问题,你只调用OnCancel()或者只调用OnClose()试试,如果还不行就2行都去掉调OnOk()试试,说实话,我到现在都没明白Oncancel()和OnOk()2个函数底层到底有哪些不同,有哪个大牛能给我讲讲
我觉得最后2行代码可能有问题,你只调用OnCancel()或者只调用OnClose()试试,如果还不行就2行都去掉调OnOk()试试,说实话,我到现在都没明白Oncancel()和OnOk()2个函数底层到底有哪些不同,有哪个大牛能给我讲讲
疯掉,你说的都试了,&依旧是,,,,不行
不要追求在IDE中不弹窗报错。
只要直接运行不弹窗报错即可。
WinExec(&taskkill&/IM&RO2Test.exe&,SW_HIDE);
不要追求在IDE中不弹窗报错。
只要直接运行不弹窗报错即可。
WinExec(&taskkill&/IM&RO2Test.exe&,SW_HIDE);
其实我并不是追求完美的人!
只是,令人费解的是,我在单步调试的时候,会出现异常!
直接把生成的exe运行起来,也是一样的异常!
奇怪的是,无意间拿到别人电脑上去运行,就好好的!
oh&my&god。。。。
无解。。。
就这么结束吧!
用depends.exe查看exe依赖的dll及其版本号。
楼主需要学习的东西还很多很多。
Multiple&Threads&in&the&User&Interface&
把ONcancel去掉看看君,已阅读到文档的结尾了呢~~
精品:mfc 退出程序 mfc应用程序 结束mfc应用程序 mfc视频教程 孙鑫mfc教程 mfc关闭应用程序 mfc教程 mfc入门教程 vs2010 mfc教程 vc mfc教程
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
MFC教程(6)--应用程序的退出
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
【精品】C++中的异常处理
下载积分:620
内容提示:【精品】C++中的异常处理
文档格式:DOC|
浏览次数:1|
上传日期: 15:25:50|
文档星级:
该用户还上传了这些文档
【精品】C++中的异常处理
官方公共微信9_异常处理_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
9_异常处理
上传于||文档简介
&&C​+​+
大小:693.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢C语言main函数、return、exit函数
C语言main函数、return、exit函数
说到return,有必要提及主函数的定义。很多人甚至市面上的一些书籍,都使用了void main( )这一形式 ,其实这是错误的。
C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着:
The definition void main( ) { /* ... */ } is not and never has been in C++, nor has it been in C.( void main( ) 从来就不存在于 C++ 或者 C )。
下面分别说一下 C 和 C++ 标准中对 main 函数的定义。
<FONT class=Apple-style-span color=#. C
  在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:
  int main( void )
  int main( int argc, char *argv[] )
  (参考资料:ISO/IEC
(E) Programming languages — C 5.1.2.2.1 Program startup)
  当然,我们也可以做一点小小的改动。例如:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成别的变量名(如 intval 和 charval),不过一定要符合变量的命名规则。
  如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] ) 。
  main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。
注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 是 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧!不过,gcc-3.2(Linux 下的 C 编译器)会在生成的目标文件中加入 return 0; 。
<FONT class=Apple-style-span color=#. C++
  C++ 98 中定义了如下两种 main 函数的定义方式:
  int main( )
  int main( int argc, char *argv[] )
  (参考资料:ISO/IEC -9-01)Programming languages — C++ 3.6 Start and termination)
int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样,main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2(Linux 下的 C++ 编译器)支持。
<FONT class=Apple-style-span color=#. 关于 void main
在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main 。g++ 3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc-3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main 。
<FONT class=Apple-style-span color=#. 返回值的作用
l main 函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出,否则代表程序异常退出。
下面我们在 winxp 环境下做一个小实验。首先编译下面的程序:
  int main( void )
  return 0;
然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为 0 。
假设刚才编译好的文件是 a.exe ,如果输入“a && dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a && dir”,则 dir 不会执行。因为 && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。
l 也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。
这就是 int main 的好处。如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float),重新编译后执行“a && dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a || dir 的话,则表示如果 a 异常退出,则执行 dir 。
<FONT class=Apple-style-span color=#. 那么 int main( int argc, char *argv[], char *envp[] ) 呢?
  这当然也不是标准 C 里面定义的东西!char*envp[](Linux C中的) 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。
到了这里,你应该了解为什么主函数定义为 int返回类型,而且函数体里面有return 0;这个语句了吧。
return函数
return表示中止当前函数的运行,并将操作权返回给调用者。
如果是在main函数中,表示将操作权返回给操作系统。
return不是必须要返回一个值。
void func(void)
当然,就算不写return,在函数执行完毕后也会返回操作权给调用者。写return是一种清晰的风格,可以防止一些意外的错误。所以书上只说应该写,而不是必须写。 return 0是正常退出,return 非零 是异常退出,这是返回给控制台的,不在你编的程序的控制范围内,是给操作系统识别的,对你的程序无影响。 在C语言中,return函数有两种原型
1、return 1;
2、return (1)
这两种原型是等价的。
关于return的几句话是:
1、有些函数确实可以不需要return,自然结束即可,如上面的OutputSomething();
2、有些人习惯为return的返回值加一对(),如: return (a); 这样写和完全一样。当然,在某些特殊的情况下,一对()是必要的。
3、一个函数是void类型时,return不能接返回,这时return仅起结束函数的作用。
4、记得return 接的是一个表达式,可以是一个立即数,一个变量,一个计算式,前面我们就看到 return a+b;的例子。 return 甚至也可以接一个函数。
应用return应该注意的
只要一个函数的返回值是数字型的,那么就可以返回0(即return 0),其实你返回多少都没问题。一般情况下,C++ 做出来的函数都要求返回一个值,当函数执行正常,且达到了一般情况下的目的,那么就返回0表示正确的调用了该函数,这个0就是返回给主调函数以通知没有出错的;如果函数调用中出错,或者没有按照一般情况执行,那么就返回1,以告知主调函数采取响应策略;如果你在某个函数所在类的定义所在的头文件中定义了一组状态值(一般都是负整数),那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误,这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void,至少返回应该是int,而在函数的最后加上return 0.语句:
  int func(参数列表)
   return 0;
  在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。
  如果你定义一个函数有返回类型,可以想下面那样调用:
  int func()
  int main()
   intvalue = func();
   return 0;
return语句后面具体是什么内容,这就要具体情况具体分析了:
l 在返回类型是char的函数中,return后应该是char类型的值;
l 在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;其他的按照你的目的而定,只要是int 类型就行了。
l 在返回类型是结构类型的函数中,return后应该是结构的一个实例对象。
总之,函数定义为什么样的返回类型,该函数中return后就应该是相应类型的值。
return是返回值,如果没有值,那么就返回空,编写者其实也就是想中断函数执行,返回调用函数处。
———————————————————————————————————————————————————————————————————————
exit函数和return函数的主要区别是:
&&&&1)exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数。通常情况:exit(0)表示程序正常, exit(1)和exit(-1)表示程序异常退出,exit(2)表示表示系统找不到指定的文件。在整个程序中,只要调用exit就结束(当前进程或者在main时候为整个程序)。
&&&&2)return是语言级别的,它表示了调用堆栈的返回;return( )是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时。如果有时要检测上个进程是否正常退出。就要用到上个进程的返回值,依次类推。而exit是系统调用级别的,它表示了一个进程的结束。
&&&&3)exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息。
&&&&4)和机器和操作系统有关的一般是:&0为正常退出,非0为非正常退出;
发表评论:
TA的最新馆藏[转]&[转]&[转]&[转]&

我要回帖

更多关于 mfc函数 的文章

 

随机推荐