Next, you'd grep for all the occurrences of release and perform the same checks. The difference is between having to review and understand every single path of execution vs. making just a few localized tests. In principle, you could convince yourself of the correctness of a program with goto s. You'd just have to follow all possible branches. In a structured program, on the other hand, your can localize your inspection to structural blocks of code.
Locality is the key in both cases.
Failure modes in Resource Management are also easier to debug. The most common bug is trying to access a strong pointer after it had released the ownership of the resource. This causes an immediate fault and is extremely easy to track. And if you're having trouble finding one, you have very likely discovered a design problem in your software. Having said that, there are certain cases when sharing ownership may be the best, or even the only, option.