на самом деле, разница между С++ и C# - одна и это то, что память не ресурс, но все остальные ресурсы-то остаются, и остаются все связанные с ресурсами проблемы:
1. ресурс - конечен
2. ресурс - требует детерминированное удаление (следует из п.1)
3. при чистке ресурсов нельзя полагаться на существующие GC (т.к. GC - недетерминирован и п.2)
4. если кто-то использует ресурс - то он сам по себе становится ресурсом (из п.2)
5. при работе с ресурсами приходится использовать метод подсчета ссылок (т.к. бывают ссылки много к одному, и да более сложные методы провисают по скорости, и да нам же нужен п.2)
6. есть проблема с циклическими ссылками (из п. 5)
И все эти проблемы есть и в C#, и в C++, но... большую часть объектов составляют всякие вспомогательные объекты: строки, точки, числа, коллекции, которые используют лишь один вид ресурса - память, соответственно как только память перестает быть ресурсом, то и вся толпа этих объектов тоже перестает быть ресурсами (см. п.4).
итого:
разница между программированием на C++ и C# лишь в том:
что при программирование на C++ приходится постоянно прокручивать в голове, что весь миллион используемых объектов - это ресурсы, и соответственно при каждом чихе проверять все перечисленные 6 пунктов,
на C# тоже необходимо крутить мысли про ресурсы - только уже про десяток-сотню-десятки тысяч основных объектов, и развязывать себе руки при работе с остальным миллионом вспомогательных объектов.
смотрите также
.net vs C++
C# vs C++
ниши языков