@deavid I think that the best way to understand borrowing and lifetimes is in terms of stack allocation.
Basically, every function allocates memory for its variables on the stack; that memory is freed once the function exits. So other functions can use that memory by reference so long as they're callees of that first function.
If you want to store something on the heap, the *reference* to that thing is stored as a smart pointer on the stack (Box, etc) that deallocates the heap memory when it goes out of scope.
And, you can explicitly give your callee the responsibility of freeing some referenced memory by passing them the associated variable as an owned value.