Or You Could Simplify The Error-Recovery Paths
Or You Could Simplify The Error-Recovery Paths
Posted Dec 29, 2014 19:14 UTC (Mon) by rleigh (guest, #14622)In reply to: Or You Could Simplify The Error-Recovery Paths by ldo
Parent article: The "too small to fail" memory-allocation rule
Nowadays I'd do this:
std::unique_ptr<a> ptra(std::make_unique<a>(args)); // a instance allocated
std::unique_ptr<b> ptrb(std::make_unique<b>(args)); // b instance allocated
// stuff that might fail.
ptrb->foo(ptra->bar());
// Cleanup of ptra a instance and ptrb b instance is automatic
I know this isn't going to be acceptable in the kernel, but in userspace this gives you guaranteed correct behaviour on error, and will clean up correctly on allocation failure of either instance, returns at any point and also exceptions at any point. No need for complex conditionals. No need for gotos. It's all automatically handled.
Unless you really want to suffer with C, you can just have it all handled if you use the facilities C++ offers you. The worry that you've missed some special case is taken care of by RAII, and it does lead to simpler, more readable, more maintainable and more robust code.
Posted Dec 29, 2014 19:23 UTC (Mon)
by cesarb (subscriber, #6266)
[Link] (3 responses)
If you are willing to use GNU extensions, you can have it on C too via __attribute__((__cleanup__(...))). One well-known project which uses it is systemd.
But I agree that it's not going to be acceptable in the kernel, since it introduces implicit calls to the cleanup functions, and kernel developers prefer to be explicit.
Posted Dec 29, 2014 23:11 UTC (Mon)
by rleigh (guest, #14622)
[Link] (2 responses)
Posted Dec 30, 2014 23:28 UTC (Tue)
by cesarb (subscriber, #6266)
[Link] (1 responses)
Posted Dec 31, 2014 11:17 UTC (Wed)
by rleigh (guest, #14622)
[Link]
Or You Could Simplify The Error-Recovery Paths
Or You Could Simplify The Error-Recovery Paths
Or You Could Simplify The Error-Recovery Paths
Or You Could Simplify The Error-Recovery Paths