The C++ Destructor pattern has a certain level of elegance to it. You reliably know that when the object is moved out of scope or destroyed, the connection is closed. That is a big win IMO. All the sudden, a properly written object handles both memory management AND resource management. Something no other GC language can really claim.
No argument from me there. Garbage collectors are designed to manage memory, not generalized to the point where they can handle any resource acquisition scenario. For a language to be truly object-oriented I think it has to feature support for the object lifecycle, at least creation and destruction. C++'s constructor/destructor paradigm was one of the real revelations for me when I first started using it in my migration from C and procedural Pascal. In C# you have to implement an interface and either call a method explicitly or place the reference within a using block. Python 3 adds support for enter and exit methods called on an object referenced with the 'with' statement. These are mostly rather clunky approaches to me. C++ had and has the most elegant implementation of the object lifecycle that I have used personally.
