C++ versus Java, or references to references versus values of references.
A few years of Java really make it hard to write C++ again. Quick, which language is this?
That works in Java and C++ but for different reasons. It's usually safer in C++.
In Java that code is less safe because it hasn't been tested for null. That is, one of the following already happened:
-
Stuff stuff = null;
-
Stuff stuff = new Stuff();
-
Stuff stuff = Stuff.class.newInstance();
C++ gives you stronger references. For that same line of code, one of these already happened:
-
Stuff stuff;
-
Stuff *stuff_p = new Stuff(), &stuff = *stuff_p;
-
Stuff& f2() { Stuff stuff; return stuff; }
- This
refers to an object allocated on the stack. It's there, baby -- as much as anystufforint.float
- This
refers to an object successfully allocated in the heap.stuff
- Very bad.
destructed the stuff before giving it to you. Just keep compiler warnings on and it will bark "warning: reference to local variable 'stuff' returned"f2
What wasn't shown for C++ was
-
Stuff *stuff;
-
Stuff *stuff = null;
-
Stuff *stuff = new Stuff();
-
std::auto_ptr<Stuff> stuff(new Stuff());
- Uninitialized pointer, a.k.a. Runtime Russian Roulette. Unfortunately I couldn't get g++ to whine about this even with
.-Wall -Wpedantic -Wextra
- Null pointer, a.k.a. the minimum guarantee of Java.
- Hmm, I don't see a delete any where around here... uh-oh...
- There you go. You've got a smart pointer on the stack to prevent memory leaks, while preserving the expected
syntax.->
So WHAT? Really now!
Java guarantees that a reference will be initialized, and that it must always be tested for null. C++ warms the hearts of bearded old curmudgeons with more types of references. Each type is useful alone and in sometimes in conjunction (e.g. non-const references to pointers for output parameters). This is useful and important information to know. Draping Object everywhere and automating garbage collection is a lowbrow kludge.
Footnote 1: Groovy's safe navigation operator helps test for null by GOTOing the next safe expression. An interesting idea, and hopefully self-preventative. If I saw code with lots of '?' it would be up for a rewrite sooner rather than later.


