@jxy, I think the behavior makes sense. If you assign to a field with a destructor, the destructor gets called for the field. Otherwise assignment would always leak.
It seems like the rules are pretty simple. Destructors get called when they should be. The only surprising thing is that creating a custom destructor loses the default behavior. You have to completely specify the behavior of your destructor if you implement your own. Fair enough!