I've been writing #CPP for about a month now, and even though I have to lookup the docs very very often, the hardest thing I find is to keep track of lifetimes of objects, references and (smart) pointers. Using references and smart pointers gives an illusion of almost having automatic garbage collection. But one mistake of not tracking the lifetime correctly, and the object disappears, causing null pointers and segmentation faults.
I don't know if I'm running into these issues because I'm a noob or because that's how C++ programming goes. Hopefully it will become more intuitive with time.