Стандартный дефект библиотеки # 254, который охватывает добавление новых конструкторов исключений:
std::logic_error::logic_error(const char* what_arg);
std::runtime_error::runtime_error(const char* what_arg);
// etc.
дает в качестве обоснования идею о том, что сохранение std::string
открывает некоторые банки червей, связанные с потенциально проблемным распределением памяти.
Тем не менее, после начала обсуждения orlp в Lounge, мне кажется, что если бы стандарт не должен был утверждать, что what_arg
были только строковым литералом (или указатель на какой-то другой буфер статической продолжительности хранения), в любом случае ему придется выполнить копию C-строки, чтобы поддерживать четкость функции-члена what()
.
Это потому, что:
void bar() {
char buf[] = "lol";
throw std::runtime_error(buf);
}
void foo() {
try {
bar();
}
catch (std::exception& e) {
std::cout << e.what() << '\n'; // e.what() points to destroyed data!
}
}
Но я не вижу такого мандата. На самом деле, если объекты исключительных объектов имеют глубокую копию what_arg
или нет, они полностью не определены.
Если это так, то большой кусок обоснования для добавления перегрузок в первую очередь (исключение дополнительных распределений) оказывается совершенно пустым.
Является ли это потенциально стандартным дефектом, или я здесь что-то не хватает?
Это всего лишь случай "программиста: не пропускайте оборванных указателей в любом месте"?