Javában elég idegesítő korlát pl. az automatikus memóriamanagement hiánya.
C++-ban megszokott gyakorlat pl. az erőforrás lockolásokat úgy megoldani, hogy egy scope-ban létrehozunk egy lokális példányt a lockból, ami automatikusan felszabadul, mikor a scope-ot elhagyjuk.
Egy másik, hogy én személy szerint a GC-t leginkább értelmetlen korlátozásnak tartom, ami egy teljesen rossz C++-programozói szokásra született workaround. A GC-t a rossz szokással együtt a Java nyelv részévé tették. C++-ban persze ma már egyre kevesebben programoznak ilyen módon, leginkább csak azok, akik Java irányból jönnek.
Arról van szó, hogy sokan teljesen indokolatlanul mindent new operátorokkal hoznak létre normál tartalmazás és containerek használata helyett. Ez hozza be az elfelejtett delete operátorok problémáját, amire workaroundként megszületett a GC.
Ha viszont betartod egy projectben a "minden tartozik valahova" elvet, nem használsz new és delete operátorokat és a malloc/free párost sem, akkor az egész probléma köddé válik. Egészen nagy projecteket láttam, amikben nem volt egy new operátor sem, vagy maximum 1-2.
És mégsem lennék annak a pártján sem, hogy akkor tiltsuk be a new operátort. Néha mégis szükség van rá, pl. a containerek kódjában mindenképpen.