Why not just do simple C++ RAII in C?

RAII in C vs C++

  • Many argue that full C++-style RAII depends on C++’s complex object model (constructors, destructors, copy/move semantics, special member rules).
  • Some say these rules (0/3/5) are simple in practice if followed mechanically; others call them arcane, emergent complexity that surprises newcomers and breaks code in non-obvious ways.
  • Several note that C++ “struct” is not a plain C struct; once you add non-trivial behavior, C++’s lifetime and object rules apply, unlike C’s simple “bag of bits” model.

Why “Just Add RAII to C” Is Contentious

  • One view: you can’t bolt on destructors without importing a lot of C++-like machinery (object lifetime rules, copying/moving, possibly name mangling or overloading).
  • Another view: you could add some notion of constructors/destructors and copy/move behavior in a C-specific way; past proposals are called incomplete rather than fundamentally impossible.
  • A recurring technical sticking point: what happens when a struct with cleanup semantics is copied, moved, or embedded inside other structs, and who “owns” the resource.

Defer, Cleanup Contexts, and Alternatives

  • Many favor a defer-style construct for C, or compiler-supported cleanup attributes, as a simpler, scope-based way to ensure teardown without full RAII.
  • Others propose thread-local “cleanup contexts” or callback lists instead of object-based lifetimes.
  • Some point out this is more like structured cleanup than full RAII: it doesn’t handle non-lexical lifetimes or complex ownership graphs.

Memory Management Models (RAII vs GC vs Others)

  • Several contrast C’s “you’re on your own” model with RAII (C++, Rust), GC (Go/Java), and ARC (Objective‑C/Swift).
  • Rust is repeatedly cited as having a cleaner ownership/move model: no implicit copying for types with destructors, explicit clone, and moves that don’t leave “zombie” objects.
  • Zig is discussed as an example of explicit allocators, arenas, and defer, plus safety‑checked undefined behavior; some emphasize these patterns could be done in C but aren’t culturally.

“Don’t Ruin C” vs “C Is Already Too Sharp”

  • One camp wants C to stay minimal and predictable, fearing feature creep will turn it into “C++‑lite.”
  • Another counters that real-world C already has pervasive undefined behavior and macro tricks; it is not actually simple or safe, just low-level.