> Может это хоть как-то поможет:Ты тоже почитал ответы Школьника и Манянима?
Нет, не поможет. Тут проскакивали ссылки на copy_elision, сходи и почитай, там описывается откуда берётся это поведение, при котором деструктор вызывается не на значение, а на область памяти содержащее это значение.
Я так подумал, о том что происходит в голове у того анонима выше, и почему ему до сих пор кажется, что я чего-то не понимаю, и у меня возникло предположение. И думаю, что у тебя происходит то же самое, что и у него. Вы не различаете достаточно точно переменную и её значение. Или кусок памяти, и значение хранящееся в нём. Ты знаешь разницу между указателем и адресом? Вот здесь примерно то же самое. Когда выполняется присваивание, одно из значений (которое в данном случае является инстансом класса, или объектом) исчезает. Оно превращается в тепловую энтропию. Это как здесь:
int a = 2;
a = 7;
После a = 7 значение 2 исчезло и превратилось в термодинамическую энтропию, процессор стал чуть теплее. Так и в том примере моём присваивание уничтожило старый объект (старое значение переменной). Память, которая содержала тот объект осталась, и в ней теперь хранится новый объект, а старый прекратил существование. Но деструктор старого объекта будет вызван тогда, когда лайфтайм куска памяти/переменной закончится.
То есть, дефолтный operator= реализован с нарушением семантики C в пользу каких-то там оптимизаций. Это называется Copy Elision. Ссылки ты можешь найти в этом обсуждении. Нарушения этой семантики не проявляют себя, если дефолтного деструктора достаточно. Если же деструктор кастомный, то чтобы получить семантику C, которая проводит чёткую границу между значением и памятью, надо реализовывать ещё и свой operator=.