You are just using the worng pattern. Use
Computation a;
Computation b;
use(a, b);
Then if the computation aborts in b, then computation a will be cleaned up as intended.
This was somewhat of a problem in C++03 because writing a copy assignment operator that can't fail is sometimes impossible, but I have never encountered a scenario where I was unable to make move assignment noexcept.