Objects defined in a loop are destroyed once per iteration of the loop, on exit from the block, or when control transfers to a point prior to the declaration. Objects declared in a block that is not a loop are destroyed on exit from the block or when control transfers to a point prior to the declaration.
Note Destruction can mean simply deallocating the object or, for class-type objects, invoking the object’s destructor.
When a jump statement transfers control out of a loop or block, objects declared in the block transferred from are destroyed; objects in the block transferred to are not destroyed.
When control is transferred to a point prior to a declaration, the object is destroyed.