Weak references allow the programmer to retain a reference to an object
without preventing the object from being destroyed.
They are useful for implementing cache-like structures.
If the original object has been destroyed, null will be returned
when calling the WeakReference::get() method.
The original object will be destroyed when the
refcount for it drops to zero;
creating weak references does not increase the refcount of the object being referenced.