It's actually the other way around: scoping dictates when destructors are called and the length of the lifetimes of borrowed pointers etc.
That is, the main factor is scoping, and lifetimes just reify that into something the programmer and compiler can reason about, to ensure safety.
Sorry, I meant (and I guess myrryr meant too) ownership instead of lifetimes. I was in the process of ninja-editing my comment when I saw your reply :P
Ownership dictates when a value goes out of scope and hence when the destructor is called.
It's actually the other way around: scoping dictates when destructors are called and the length of the lifetimes of borrowed pointers etc.
That is, the main factor is scoping, and lifetimes just reify that into something the programmer and compiler can reason about, to ensure safety.