Ничего особенного не произойдет. Вы могли бы написать в каком-то месте в середине выделенной памяти (100 байт от начала, 99 байтов до конца выделенной памяти).
Тогда вы освободите эту выделенную память. Компилятор будет обрабатывать его именно так, как мы и ожидали. Память, выделенная этим, совершенно не связана с завершенными нулем строками. Вы можете вставить все, что вы хотите в эту память. Это какой-то «сырой» кусок памяти, вы даже можете создать какой-нибудь произвольный объект C ++ в эту память (размещение нового).
Ваша ошибка где-то еще. Например, здесь есть одна распространенная ошибка, когда конструктор вызывается один раз, а деструктор вызывается дважды, дважды удаляя что-то:
struct A { P *p; A() { p = new P; } ~A() { delete p; } };
A getA() { return A(); } int main() { A a = getA(); }
Теперь происходит то, что конструктор по умолчанию вызывается один раз, а созданный объект копируется ноль или более раз. Но деструктор запускается для каждой созданной копии. Таким образом, вы будете вызывать деструктор по указателю более одного раза, что приводит к таким странным ошибкам. Правильный способ исправить , что , - это использовать умный указатель, такой как shared_ptr
. В качестве упражнения вы также можете обойтись без этого, написав соответствующие конструкторы копирования, которые копируют объект и выделяют память в конструкторе копирования, так что копия и соответствующий исходный объект сохраняют разные указатели.