I started with C at around 1989, until in 1991 I realized I was programming using object oriented techniques using structs and make shift inheritance, while working on a video game project.
I picked up Bjarne Stroustrup's C++ book, which made programming so much better.
I really liked (like) programming in C++, but the language has its shortcomings. It allows people to personalize too much to their liking. It often falls apart in team settings. C++ suffers from the same fallacies as C and much more.
It's possible to write good clean effective code, but only if everyone on the team knows what they're doing.
I've written a sophisticated memory debugging tool like 'BoundsChecker', including memory overrun and leak detection. I was checking for memory overruns by automatically adding little wall boundaries around each memory allocation, and then upon freeing check to see if the values of that wall had changed. It also had the option to line up memory allocation against a protected memory block, so that the debugger would break the application at the exact point of memory overrun.
Memory leak detection was done by recording where each memory block was allocated, and reporting which allocations were never freed.
These days, I recommend using "valgrind", although I'm not sure if it has the sophisticated hardware assisted protected memory block memory overrun detection techniques.