Несколько вещей, о которых следует помнить здесь. Во-первых, оператор = класса, как правило, позаботится об удалении всего, на что он ссылался, до назначения новых данных. Что ж, это не совсем так, часто умный разработчик реализует operator =, сначала создав копию входящего класса, а затем поменяв текущие данные с новым временным, который теперь владеет, и удаляет его. Однако важно помнить, что до появления функции operator = старые данные, вообще говоря, отбрасываются.
Еще одна вещь, которую нужно иметь в виду, это то, что "ABC" является строковым литералом. Стандарт на самом деле не определяет, как они должны храниться, он просто устанавливает ограничения, которые допускают определенные обычные реализации. Очень часто этот строковый литерал будет отображаться как элемент только для чтения в данных программы. В этом случае он никогда не будет удален, пока изображение программы загружено в память (когда оно работает в основном). Вот и вся причина, почему такой код - UB:
<code>
void f()
{
char * x = "hello"; // points to a string literal.
x[0] = 'H';
}</p>
<p>// correct implementation is:
void f()
{
char x[] = "hello"; // reserved an array of 6 characters and copies string literal content.
x[0] = 'H';
}