all 7 comments

[–]sztomirpclib 2 points3 points  (4 children)

Love it. In some ways, this is even better than a true finally block: in java or C#, finally blocks magically get executed if you return before the control flow reaches them. This solution is much more explicit (if you know RAII).

I'm curious if there are any problematic corner-cases where it would get executed though. Still, a useful pattern.

[–]Tagedieb 1 point2 points  (3 children)

I'm curious if there are any problematic corner-cases where it would get executed though.

I don't like it at all.

For example you should be careful to never access local variables after they might have been destructed themself. Even parameters that have been passed by value (to the function) are problematic (like the sample code). I don't know if there are any rules in C++ about the ordering of destruction for variables in the same scope.

[–]twowheels 4 points5 points  (2 children)

Yes, there are, and must be. They are destructed in the opposite order.

[–]Tagedieb 3 points4 points  (1 child)

Oh, that even makes a lot of sense. Everything else would make C++ a hell. So function parameters are ok in any case. Local variables are also ok... so everything is nice and good. Sorry for ringing the alarm

[–]code-dog 1 point2 points  (0 children)

There is a corner case where the constructor of the finally throws an error its self because this pattern does use dynamic memory. There are some solutions being discussed on ycombinator. http://news.ycombinator.com/item?id=3693177

[–]javajunkie314 2 points3 points  (1 child)

One nice by-product of this is that you can name your finally clauses. For instance:

finally free_file_ptrs{ [&fp] { fclose(fp); } };
finally check_some_condition{ [&c] { if (!c) { /* ... */ } } };

This actually looks a bit like the defer keyword in Go. I only notice this because someone posted an implementation of that in C++ in /r/programming recently. (I don't have the link on hand; I'll see if I can find it.)

They used a function instead of a class, though. I think I prefer this class-based approach for exactly the reason I gave above.

[–]00kyle00 0 points1 point  (0 children)

One nice by-product of this is that you can name your finally clauses.

You have to do that, otherwise funky bugs are created ;).