Current behaviour when delegates stays alive when its outer scope is destroyed is just a bad language design.
No, destroying is unsafe by definition, and this is why GC solve a lot of problems.
Can you explain what is the problem ? What does creating an object change except adding 2 pointers into the frame pointer ?