It's possible to keep a global weakref dictionary where the key is the object whose lifetime needs to be watched, and the values are objects to keep alive.
We can use this to hook Draw() methods and ensure that things which are drawn are kept alive as long as the canvas(es) they're drawn to.
This same technique could also be used for a TTree's internal buffers, and in other places.
@ndawe I think this counts as done for now. You may want to open up a new issue if you think this could apply to the TTree buffers.