Skoro - použití GC je (velmi často, ne vždy) zbytečnost, ale má svůj super use case - neprogramátoři, prototypování, v některých případech i v produkci.
Nevidím problém v tom si paměť uvolnit sám, přesně v moment, kdy má být uvolněna. Typicky v Cčku na malloc pohlížím jako na blok - když napíšu malloc, hned pod něj píšu free a kód strčím mezi. Při dodržení single exit point je to velmi spolehlivé.
...
Ano, uvnitř bloku se může stát ledacos špatného, ale buď je to správně ošetřeno, nebo to není tak kritické a blok dojede včetně free, nebo to třeba segfaultne a paměť se mi uvolní tak nějak přirozeně
, nebo je to ve stavu, ve kterém to nikdy nemělo být a musí se to vyřešit. Tohle ani GC nezachrání.
Jasně, takže....:
v1 = priprav_objekt();
v2 = pripav_objekt_2(v1);
if (v2 == null) {
free(v1);
return;
}
v3 = priprav_objekt_3(v1, v2);
if (v3 == null) {
free(v2);
free(v1);
}
Jasně, dá se to trošku vylepšit těma "goto" a la linux kernel, případně nějakým jedním místem, kde uvolním všechno, co není null... nedejbože, aby na ten objekt ukazovalo něco od někud jinud, že....
A jinak, to je pořád řečí, jak musí být kód čitelný (někteří to považují za důležitější, než jeho funkčnost) a najednou je používání primitivních postupů špatně? Ono totiž většinou čím primitivnější, tím lepší. Chce to kázeň. A to je právě to, co velmi často chybí a proč vzniká tolik kočkopsů.
Jestli chápu správně, tak pro tebe kód, kde třetinu kódu zabírá memory management (který de-fakto nemá nic společného s řešeným problémem) je čitelnější než kód, kde se o to stará GC?
Jinak doporučuji se zamyslet nad tím, jak budeš řešit třeba asynchronní výjimky v multithreadovaném kódu - to se jaksi neřeší segfaultem, ale jen umře ten thread a ta paměť se uvolní, pokud ji nepoužívá někdo jiný v jiném threadu... už jsi něco takového zkoušel programovat?