Это не std::vector
, что это не безопасно исключение, он использует сырые указатели для управления памятью:
int main()
{
try
{
int* i = new int;
throw "oops, memory leak!";
}
catch (...){}
}
Это не имеет ничего общего с Вектора по сути, это просто, что делает это та же самая проблема:
int main()
{
try
{
std::vector<int*> vi;
vi.push_back(new int);
throw "oops, memory leak!";
}
catch (...){}
}
Оба эти фиксируются с помощью смарт-указатели:
int main()
{
try
{
std::unique_ptr<int> i(new int);
std::vector<std::unique_ptr<int>> vi;
vi.push_back(std::unique_ptr<int>(new int));
vi.push_back(std::move(i));
throw "vector destroys unique_ptr's...which delete their memory";
}
catch (...){}
}
(или shared_ptr
, что дороже. Вы также можете использовать контейнеры-указатели от Boost.)
Do ** not ** использовать 'std :: auto_ptr <>' в стандартных классах коллекции. 'std :: unique_ptr <>' и 'std :: shared_ptr <>' являются безопасными, но никакой умной указатель в стандартной библиотеке C++ 03 нет. – ildjarn
Безопасность исключений не зависит от того, что хранит вектор. – Jon
@ildjarn Я думаю, это то, что я хотел сказать, я не могу найти, где я видел упоминание, поэтому я не могу дважды проверить. Я все равно редактировал вопрос. – SirGuy