That's again an example of cleanup associated with scope. I understand what you can do it with unwind-protect and friends.
But the essence of RAII is more than that.
In c++ if I add an opened file object to some collection and later remove it or destroy the collection, it is implicitly cleaned up.
For example let's say you are implementing an n-way out of core merge: in c++ you would create a priority queue of files objects ordered by the front current from item. You pop the front file object read the item and, if the file is not empty, push it back into the queue. Cleanup is implicit by removing the file from the queue and not explicitly adding it back. On early exit (because of an error or exception) the queue is automatically destroyed and recursively all the file objects.
There might be a way to implement this recursively with unwind-protect, but I think it is less natural.
For example python has ExitStack, which in practice is an ad-hoc container that supports recursive cleanup of contained objects, but is still not as convenient as having all containers do proper cleanup.