-2

这是我的代码片段,显示了 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 块中是一个好习惯,因为向量是动态数组?

4

2 回答 2

5

块定义try范围。在范围内声明的任何内容都不能在该范围外使用。这与 无关vector,它适用于任何类型的对象。解决方案不是将声明移到块外,而是将try其他所有内容移入try块中。

try {
    vector<opClass> op;
    //...
    //...
    op.push_back(<input some stuff>)
}
catch (bad_alloc xa) {
    cout << "\nAllocation failure!\n";
    return 1;
}
于 2013-06-06T18:37:42.063 回答
4

块中的范围

一组花括号{}称为Compound statement or block(N3242 C++11)。

标准(§3.3.3/1)告诉你:

在块 (6.3) 中声明的名称是该块的本地名称;它具有块范围。它的潜在范围从其声明点(3.3.2)开始,到其块的末尾结束。在块范围内声明的变量是局部变量。

这意味着:在一组大括号内声明的任何内容都不能在外部访问。

您的变量op根本没有在您的 try-block 之后声明(这是由于括号的情况)。这并不特定于std::vector但适用于所有类型的变量。

另请注意§3.3.3/4:

在 for-init-statement、for-range-declaration 和 if、while、for 和 switch 语句的条件中声明的名称对于 if、while、for 或 switch 语句(包括受控语句)是局部的, 并且不得在该语句的后续条件中或受控语句的最外层块(或者,对于 if 语句,任何最外层块)中重新声明;见 6.4。

标准::向量

std::vector 最有可能通过适当的 try 和 catch 块来实现,以处理内存分配和对象构造的回滚。

声明向量时不需要 try/catch 的东西。然而,当按照您显示的方式声明时,向量本身不会分配任何内存。

vector<opClass> op;

这是一个空向量。该向量在堆栈上只有空间,并且不会发生堆分配,因为不需要内存。

于 2013-06-06T19:06:10.353 回答