我可以撤销还是删除atexit命令?
发布时间:2020-12-16 03:14:37 所属栏目:百科 来源:网络整理
导读:如果我放在atexit(fn);在退出堆栈中,当程序退出时,它将被执行:从main()或exit()返回. 我可以从堆栈中删除它吗? 为什么要这样做,你问? 我正在使用一个简单的try-catch机制,使用atexit,setjmp和longjmp.如果我可以撤销atexit(fn),那将是完美的; – 即使它只
如果我放在atexit(fn);在退出堆栈中,当程序退出时,它将被执行:从main()或exit()返回.
我可以从堆栈中删除它吗? 为什么要这样做,你问? 我正在使用一个简单的try-catch机制,使用atexit,setjmp和longjmp.如果我可以撤销atexit(fn),那将是完美的; – 即使它只适用于最后一个注册的功能. 编辑: 以下单词建议使我自己的堆栈… 该堆栈只适用于一个异常捕获器. void (*_catchFn[10])() = {0,0}; void _catch(){ if ( _catchFn[0] != 0 ){ (_catchFn[0])(); } } void _addCatch( void (*fn)() ){ _catchFn[0]=fn; } void _remCatch( void (*fn)() ){ _catchFn[0]=0; } void test(){ jmp_buf env; void catch(){ // we get here after an exit with a registered catch longjmp(env,1); // return to the line marked except... // that first will get the value 1 } int first = setjmp( env); // ** return here ** fprintf( stderr,"test: After setjmp. first=%dn",first ); if( first == 0 ){ // try this code _addCatch(catch); // register the catch function to 'catch' the exit fprintf( stderr,"test: Before CHECKn" ); // CHECK something and something bad happens and it exits exit(1); // like this fprintf( stderr,"test: After CHECK - THIS SHOULD NEVER BE SEEN AFTER AN EXCEPTION.n" ); }else{ fprintf( stderr,"test: After longjmp return. first=%dn",first ); } _remCatch( catch); fprintf( stderr,"test: IT WORKED!n"); exit(1); // exit again to see if we are safe } int main(){ atexit( _catch ); // register my global exception stack test(); } 解决方法
为什么不从单个atexit()函数构建自己的堆栈?这样你可以操纵堆栈你想要的.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |