The notion of ownership
When we say that object A
owns object B
, what we mean is that object A
manages the lifetime of object B
--that A
controls the construction, copying, moving, and destruction of object B
. The user of object A
can (and should) "forget about" managing B
(for example, via explicit calls to delete B
, fclose(B)
, and so on).
The simplest way for an object A
to "own" an object B
is for B
to be a member variable of A
. For example:
struct owning_A { B b_; }; struct non_owning_A { B& b_; }; void test() { B b; // a1 takes ownership of [a copy of] b. owning_A a1 { b }; // a2 merely holds a reference to b; // a2 doesn't own b. non_owning_A a2 { b }; }
Another way is for A
to hold a pointer to B
, with the appropriate code in ~A()
(and, if necessary, in the copy and move operations of A
) to clean up the resources associated with that pointer:
struct owning_A { B *b_; explicit owning_A(B...