C++'a özel bir şey değil pointerlar. Optimizasyon durumu da. Ama evet, dediğin gibi.
GC olmaması durumu zorlaştıran bir şey değil. Scope takip etmeyi biliyorsan, GC olmaması ciddi bir problem teşkil etmiyor.
C++ objeleri scope dışına çıktığında ölürler. (Yine C++ özel bir durum değil) Yaşamazlar. Pointerlar bu duruma istisna tabii ki. Onların life timelarını biz yönetiyoruz. C++'ta constructorlar gibi, destructorlar da var. Bunlar objenin scope bitişinde yok olmasını sağlayan şeyler. Varsayılan olarak C++ compilerları senin için default, copy, move constructor ve destructor'ı oluşturacak. Bunlarla da memory management yapıyorsun.
Mesela kopyalanmasını istemediğimiz şeyler var. Pointer memberı olan şeyleri kopyalamak istemeyebilirsin mesela. Aşırı large dataların kopyalanmamasını isteyebilirsin. Sadece move edilmesini istersin mesela. Bu tarz durumlarda memory managementi kendin yapıyor olmak daha sağlıklı oluyor. Ne yaptığını bilerek iş yapmış oluyorsun. Her GC çağrısında da performans hiti yemiyorsun mesela.
Program yaşadığı müddetçe hayatta kalmasını istediğimiz datalarda var. Mesela kullandığım game engine de Bitmap dataları ekrana çizdirmeye devam edebilmem için OpenGL'e gerçekleşen context share süresince Bitmap'ın datasının hayatta kalması ve silinmemesi lazım ki OpenGL çizmeye devam edebilsin. Aksi halde OpenGL datayı bulamayacağı için çizemeyecek ve çökecek.
GC'ler genelde bunları otomatik takip eder ve nadiren başarısız olurlar takip sırasında. Fakat bu takip süreci performansa etki ediyor işte.