As this piece of code is normally a function, should be more readable if all of it is put inside a function returning a bool, indicating success or failure.
The cleanup function could be only resource deallocation, not a function at all. If it is intended to use with C++ or C#, a try..finally block should be more appropriate.
This piece of code use a try block, which is not super performatic at all, but ensure that all allocated resource are properly freed.
bool DoOperations()
{
try
{
if(condition1_fails)
{
return false;
}
...
if(condition2_fails)
{
return false;
}
...
...
if(conditionN_fails)
{
break false;
}
PerformActionOnAllSuccess();
return true;
}
finally
{
if (condition1_resource != null)
{
}
if (condition2_resource != null)
{
}
...
if (conditionN_resource != null)
{
}
}
}