Вот фрагмент моего кода, показывающий объявление вектора в блоке 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, поскольку векторы являются динамическими массивами?
try
Блок определяет область. Все, что объявлено внутри области, не может быть использовано за пределами этой области. Это не имеет ничего общего с vector
, это относится к объектам любого типа. Решение не в том, чтобы переместить декларацию за пределы try
блок, это переместить все остальное в try
блок.
try {
vector<opClass> op;
//...
//...
op.push_back(<input some stuff>)
}
catch (bad_alloc xa) {
cout << "\nAllocation failure!\n";
return 1;
}
Набор фигурных скобок {
а также }
называется 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;
Это пустой вектор. В стеке есть только место для этого вектора, и выделение кучи не будет происходить, так как не требуется памяти.