Адрес начала строки в памяти после повторного использования оператора new
Допустим, есть код:
сhar* s = “Hello”;
char* str = new char[strlen(s) + 1];
strcpy(str,s);
char* p_str = str; //дополнительный указатель на эту строку
…
//далее есть необходимость сделать так
сhar* t = “world”;
delete [] str;
str = new char[strlen(t) + 1];
strcpy(str,t);
Правильно ли предположить, что после второго использования оператора new адрес начала строки str может уже отличаться (но не обязательно) от первоначального значения адреса str? Т.е. может так получится, что дополнительный указатель p_str будет «смотреть» уже не туда?
Ответы (1 шт):
Правильно предположить, что после вызова delete[] значение указателя p_str становится невалидным, так как время жизни объекта, на который тот указывал, закончилось. При этом вернет ли повторный вызов оператора new то же самое значение или другое - совсем не важно. Совпадения значения невалидного указателя с адресом живого объекта подходящего типа в С++ не делает указатель снова валидным. Для редких сценариев, когда такая ситуация используется (например повторные placement new), существует специальная "оживляющая" операция ::std::launder.