Many programming schools recommend that functions have only a single exit point. For example, the following function is considered bad programming practice because it contains three potential exit points:
int comapre_strings(const string & s1, const string & s2) { // lexicographical comparison; like strcmp() if (s1 == s2) return 0; if (s1 > s2) return 1; return -1; }
Although the “single exit” programming idiom has some merits in procedural languages, it’s virtually useless in C++. To see why, look at the following function. Ostensibly, it complies with the single exit idiom:
int func(){ char * pbuff = new char [MAX_SIZE]; // #1 std::string str ("hello"); // #2 return 0; // only one exit?}
In practice, func() has three exit points; one of which is an explicit return statement. The other two are implicit exit points: in the statement #1, if operator new fails, it will throw a std::bad_alloc exception. Throwing an exception is an exit point. Similarly, in statement #2, if string’s constructor fails, it will also throw an exception. Thus, the single exit point design idiom is pretty irrelevant in non-trivial C++ code. Instead of blindly following obsolete principles, programmers should focus on robust, efficient and functional design.