вектор c ++ не объявляется в try-catch

Вот фрагмент моего кода, показывающий объявление вектора в блоке try-catch:

try {
vector<opClass> op;
}
catch (bad_alloc xa) {
cout << "\nAllocation failure!\n";
return 1;
};
//...
//...
op.push_back(<input some stuff>) //error c2065: op undeclared identifier

Странно, когда я помещаю свое объявление вектора вне блока try-catch, ошибка исчезает. Это как-то связано с тем, как векторы определены в STL? Я думал, что было бы неплохо поместить это объявление в блок try-catch, поскольку векторы являются динамическими массивами?

-2

Решение

try Блок определяет область. Все, что объявлено внутри области, не может быть использовано за пределами этой области. Это не имеет ничего общего с vector, это относится к объектам любого типа. Решение не в том, чтобы переместить декларацию за пределы try блок, это переместить все остальное в try блок.

try {
vector<opClass> op;
//...
//...
op.push_back(<input some stuff>)
}
catch (bad_alloc xa) {
cout << "\nAllocation failure!\n";
return 1;
}
5

Другие решения

Область в блоке

Набор фигурных скобок { а также } называется Compound statement or block (N3242 C ++ 11).

Стандарт (§3.3.3 / 1) говорит вам:

Имя, объявленное в блоке (6.3), является локальным для этого блока; у этого есть область блока. Его потенциальная область действия начинается в точке объявления (3.3.2) и заканчивается в конце его блока. Переменная, объявленная в области видимости блока, является локальной переменной.

Это означает: К чему-либо, объявленному внутри набора фигурных скобок, нельзя получить доступ снаружи.

Ваша переменная op просто не объявляется после вашего блока try (что имеет место из-за скобок).
Это не относится к std::vector но относится ко всем видам переменных.

Также обратите внимание на §3.3.3 / 4:

Имена, объявленные в операторе for-init-объявление, объявлении for-range и в условии операторов if, while, for и switch, являются локальными по отношению к операторам if, while, for или switch (включая контролируемый оператор) и не должен быть повторно объявлен в последующем условии этого оператора или в самом внешнем блоке (или, для оператора if, любом из самых внешних блоков) контролируемого оператора; см. 6.4.

станд :: вектор

Скорее всего, std :: vector будет реализован с правильными блоками try и catch, обрабатывающими откат выделения памяти и конструирование объекта.

Вам не нужно пробовать / ловить вещи при объявлении вектора.
Тем не менее, сам вектор не будет выделять какую-либо память при объявлении, как вы показали.

vector<opClass> op;

Это пустой вектор. В стеке есть только место для этого вектора, и выделение кучи не будет происходить, так как не требуется памяти.

4

По вопросам рекламы [email protected]