(не) использование std :: string в исключениях
Я всегда читал, что я не должен бросатьstd::string
или некоторые другие классы, выделяющие память. лайкВот или что более важноВот по пункту 3. -Дон»вставлятьstd::string
объект.
Так что теперь яя пытаюсь вставитьповышение :: исключение в мой проект и что я вижу:много строк.
Почему нетt boost соответствует собственной рекомендации?
И если у меня есть параметры, которые могутне быть жестко закодированным, как, например, сохраненным в конфигурационном файле, как я могу поместить их в исключение, не используя?std::string
Или это руководстводон»т использоватьstd::string
толькодействительно использоватьstd::string
как можно реже руководящее? Я'я немного смущен ... я
мы сделали некоторые исследования. Пожалуйста, поправьте меня, если яЯ не прав.
Если я правильно понимаю, этовсе о распределениив течение бросок и что происходит с выделенной памятью. Так что память теряется, если я выделяю ее в конструкторе, и она может 'быть освобожденным в деструкторе исключения, которое вызовет утечку памяти. Но это'Можно распределить это перед броском, поэтому исключение чисто.
Я попробовал это:
struct xexception {
int *ttt[10];
xexception() {
ttt[0] = new int[0xfffffffL];
ttt[1] = new int[0xfffffffL];
ttt[2] = new int[0xfffffffL];
ttt[3] = new int[0xfffffffL];
ttt[4] = new int[0xfffffffL];
ttt[5] = new int[0xfffffffL];
ttt[6] = new int[0xfffffffL];
ttt[7] = new int[0xfffffffL];
ttt[8] = new int[0xfffffffL];
ttt[9] = new int[0xfffffffL];
}
~xexception() throw() {
//never happen
delete[] ttt[0];
delete[] ttt[1];
delete[] ttt[2];
delete[] ttt[3];
delete[] ttt[4];
delete[] ttt[5];
delete[] ttt[6];
delete[] ttt[7];
delete[] ttt[8];
delete[] ttt[9];
}
};
int main(int argc, const char *argv[]) {
try {
throw(xexception());
}
catch (const xexception &e) {
std::cerr < "\nttt " < e.ttt[0][0] < std::endl;
}
catch (std::bad_alloc) {
std::cerr < "bad alloc" < std::endl;
}
return 0;
}