Hi: I'm Jonathan Caves and I'm a developer on Visual C++ compiler team.

The reason that the .NET runtime uses a garbage collector is that it is desgined as multi-language runtime: as well as C++ it supports VB, C#, Eiffel, Cobol, and other languages. So you can't really use a C++ specific technology like smart-pointers (which require templates) for a language neutral technology like the .NET runtime. Having said that I am more that certain that the .NET runtime itself, which is mostly written in C++, makes use of smart pointers internally.