Vous ne parlez pas de (plus ancien) C++ géré, mais de C++/CLI, non?
En C#, votre code est équivalent à
System.String str=new System.String();
En C++/CLI, une poignée à un objet est tout de même comme une référence en C# - vous avez le comptage de référence, garbage collector etc.
En revanche, les pointeurs C++ ordinaires sont (dans la plupart des cas) des pointeurs vers des objets non gérés. Vous pouvez (bien sûr) avoir des pointeurs C++ vers des objets gérés, juste comme vous avez des pointeurs disponibles en C# (dans un code non sécurisé). Regardez here pour une explication détaillée des pointeurs en C#, et here pour quelques détails sur les pointeurs en C++/CLI. Ces pointeurs ne sont pas gérés par le garbage collector.