From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_00,INVALID_MSGID, PP_MIME_FAKE_ASCII_TEXT autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII X-Google-Thread: 1108a1,9a0ff0bffdf63657 X-Google-Attributes: gid1108a1,public X-Google-Thread: f43e6,9a0ff0bffdf63657 X-Google-Attributes: gidf43e6,public X-Google-Thread: 103376,4b06f8f15f01a568 X-Google-Attributes: gid103376,public X-Google-Thread: fac41,9a0ff0bffdf63657 X-Google-Attributes: gidfac41,public From: "Robert Martin" Subject: Re: Software landmines (loops) Date: 1998/09/02 Message-ID: <6sjms6$7c4$1@hirame.wwa.com>#1/1 X-Deja-AN: 387146950 References: <902934874.2099.0.nnrp-10.c246a717@news.demon.co.uk> <6r1glm$bvh$1@nnrp1.dejanews.com> <6r9f8h$jtm$1@nnrp1.dejanews.com> <6renh8$ga7$1@nnrp1.dejanews.com> <6rf59b$2ud$1@nnrp1.dejanews.com> <6rfra4$rul$1@nnrp1.dejanews.com> <35DBDD24.D003404D@calfp.co.uk> <6sbuod$fra$1@hirame.wwa.com> <35f51e53.48044143@ <904556531.666222@miso.it.uq.edu.au> <35EAB5B1.1DA1986B@ehpt.com> <6sf1dn$n52$1@hirame.wwa.com> <35EB9B91.3FF8583@ehpt.com> <6sh2rp$8v3$1@hirame.wwa.com> <35ED4937.1D01ED67@ehpt.com> X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 Organization: WorldWide Access - Midwestern Internet Services - www.wwa.com Newsgroups: comp.lang.eiffel,comp.object,comp.software-eng,comp.lang.ada Date: 1998-09-02T00:00:00+00:00 List-Id: Mattias Lundstr�m wrote in message <35ED4937.1D01ED67@ehpt.com>... >Aggresive cuttings below. > >Robert Martin wrote: >> >[...] >> This is roughly equivalent to the 'finally' solution in another post. And >> I'll use the same argument. >[...] >[Loop that sets return value 'retval' and does 'goto error_exit' on >error] >> error_exit: >> if (p) free(p); >> if (f) fclose(f); >return retval; >// The point is that this is code that is ALWAYS executed. >// The only "multi-exit" issue here is the multiple exit >// points from the loop. The function has only this exit. > >Your problem with this is (as I understand you) is the use of flags >(or other method of tracking) to be able to say > >if( resource1 allocated ) deallocate( resource1 ); >if( resource2 allocated ) deallocate( resource2 ); >... >if( resourceN allocated ) deallocate( resourceN ); > >How do you mean that you could avoid this by a single-exit >solution ? Here is the solution I posted a few article back in this thread... int f() { int retval = 0; if (char* p = malloc(80)) { if (File* f = fopen("myFile", "r"); { fread(f, p, 80); ... fclose(f); } else // fopen failure { retval = 2; } free(p); } else // malloc failure { retval = 1; } return retval; } No tests necessary, structure preserved. >Btw. Why, in your opinion, are exceptions different? 1. They are indeterminate. When you throw an exception, you have no idea where control will wind up. It is not simply an exit from the current scope, or even from the current function. 2. As I prefer to use them, they are for extraordinary conditions. They are used when things go so wrong that there is no point in continuing, and also no point in maintaining any concern for efficiency. They are expensive. Finally, in the end, I still try to force a kind of single-exit mechanism on exceptions by using: catch(...){ cleanup(); throw; } (akin to Java's 'finally' clause). Robert C. Martin | Design Consulting | Training courses offered: Object Mentor | rmartin@oma.com | Object Oriented Design 14619 N Somerset Cr | Tel: (800) 338-6716 | C++ Green Oaks IL 60048 | Fax: (847) 918-1023 | http://www.oma.com "One of the great commandments of science is: 'Mistrust arguments from authority.'" -- Carl Sagan