I live in a C and C++ bubble. Anything I've ever written that involves over a couple hundred lines has always been in those two languages.
I hear around everywhere that RAII is (for the most part) a unique idiom to C++. But why is that exactly? I believe most OOP languages force you to create objects on the heap (by all means correct me if I'm wrong), which then leads to wanting a GC to deal with memory management altogether. But what's wrong/bad just having stuff work from the stack in the first place? What advantage does it serve implementing things as they do?
Perhaps this extends to the lack of understanding I have behind heap usage in the first place. I don't quite 'get' the point of it outside of precaching big stuff before it's needed. 99.9% of my code ever involving pointers at all is just interfacing with old code!
Python (and almost any other reference counted language) also has de facto RAII. If something runs out of references when it runs out of scope, it gets collected. The problem with C++'s method safety-wise is that if anything gets saved after the scope exits, if you haven't done something special, it destroys itself then-and-there.
This can be eased a little by using smart-pointers, any of various idioms, and by "being really careful"; the point is that it isn't automatically safe, so other languages don't tend to use it. For an example of a language that's trying really hard for RAII and safety, take a look at Rust. They're doing a fantastic job of, essentially, verifying these smart-pointers and idioms and carefulness at compile time to have the best of both worlds.
And then other languages have various "context manager" constructs that are similar, but it's not nearly the scale of C++ where everything's a context manager.