Если Пример 1 верен, почему Пример 3 также дает правильный вывод?
make_unique<char[]>(size + 1);
инициализирует все char
с 0. Оба примера 1 и 3 don перезаписать это, потому что они копируют соответственно меньшие из size + 1
и size
; и меньшее из size
и size
. Т.е. они оба копируют size
char
s
Что означают значения мусора в конце?
То, что ваша программа имеет неопределенное поведение. std::ostream::operator<<(char *)
в этом случае читает байты, пока не увидит 0.
Почему компилятор не выдал ошибку или исключение?
Потому что C ++ не является безопасным. Вместо того, чтобы определять конкретное поведение (например, выбрасывать исключение) при доступе вне массива, целая программа не связана правилами C ++. Это называется «неопределенное поведение».
В примере 4 Почему нет ошибки, когда мы пытались скопировать значение в конце, но не были инициализированы
, потому что C ++ не является безопасным
Как правильно инициализировать умный указатель в этом случае? Изменится ли что-нибудь, если это массив BYTE вместо char;
Либо пример 1, либо пример 3 подойдут. Однако почему бы просто не использовать std::string
?