C++ 带有pop_back函数的类模板向量无法按预期工作 #包括 #包括 使用名称空间std; int main(){ 矢量名称; 矢量名称。推回(2); 矢量名称。推回(3); cout

C++ 带有pop_back函数的类模板向量无法按预期工作 #包括 #包括 使用名称空间std; int main(){ 矢量名称; 矢量名称。推回(2); 矢量名称。推回(3); cout,c++,vector,C++,Vector,vector::operator[]()不检查向量的大小,因此您的代码正在生成未定义的行为 在您的特定情况下,当您调用pop_back()时,向量的大小(向量中的项数)正在缩小,而不是容量(底层数组的大小)。这意味着第二个向量名[1]指向未使用但现有的内存。例如,如果我们稍微编辑您的示例以检查容量和大小: #include <iostream> #include <vector> using namespace std; int main(){ vector&

vector::operator[]()
不检查向量的大小,因此您的代码正在生成未定义的行为

在您的特定情况下,当您调用
pop_back()
时,向量的大小(向量中的项数)正在缩小,而不是容量(底层数组的大小)。这意味着第二个
向量名[1]
指向未使用但现有的内存。例如,如果我们稍微编辑您的示例以检查容量和大小:

#include <iostream>
#include <vector>

using namespace std;

int main(){

   vector<int> VectorName;

   VectorName.push_back(2);
   VectorName.push_back(3);

   cout << VectorName[1] << endl;

   VectorName.pop_back();

   cout << VectorName[1] << endl;

}
三,

在抛出'std::out_of_range'的实例后调用terminate

what():vector::_M_range_check:__n(它是1)>=this->size()(它是1)

bash:7行:4793中止(内核转储)。/a.out

实例:


关于“编译错误”还有一件事。在您访问向量之前,编译器不会尝试检查向量的大小,因此编译器会在没有错误或警告的情况下愉快地编译您的代码。这取决于您作为开发人员对代码执行边界检查。

vector::operator[]()
不检查向量的大小,因此代码产生未定义的行为

在您的特定情况下,当您调用
pop_back()
时,向量的大小(向量中的项数)正在缩小,而不是容量(底层数组的大小)。这意味着第二个
向量名[1]
指向未使用但现有的内存。例如,如果我们稍微编辑您的示例以检查容量和大小:

#include <iostream>
#include <vector>

using namespace std;

int main(){

   vector<int> VectorName;

   VectorName.push_back(2);
   VectorName.push_back(3);

   cout << VectorName[1] << endl;

   VectorName.pop_back();

   cout << VectorName[1] << endl;

}
三,

在抛出'std::out_of_range'的实例后调用terminate

what():vector::_M_range_check:__n(它是1)>=this->size()(它是1)

bash:7行:4793中止(内核转储)。/a.out

实例:



关于“编译错误”还有一件事编译器在访问它之前不会尝试检查向量的大小,因此编译器将愉快地编译您的代码而不出错或警告。这是由开发人员来执行对代码的边界检查。

这是未定义的行为。未定义的行为。C++几乎从不在运行时给您错误消息,而这是ER。ror通常不能在编译时诊断,有人能解释一下为什么这个程序编译成功吗?--成功编译一个程序只意味着语法正确。它与程序能否正确运行无关。请尝试使用
VectorName.at(1)
而不是
VectorName[1]< HenriMenke >在运行时,我得到了Office of Exchange异常,谢谢您的帮助。这是未定义的行为。未定义的行为。C++几乎从不在运行时给您错误消息,并且这个错误通常不能在编译时被诊断,有人解释为什么编译这个程序是成功的。l?--成功编译程序只意味着语法正确。这与程序是否正确运行无关。请尝试使用
VectorName.at(1)
而不是
VectorName[1]
看看会发生什么。@HenriMenke在运行期间,我遇到了超出范围的异常,谢谢你的帮助。谢谢你的回答,它给了我更大的洞察力。谢谢你的回答,它给了我更大的洞察力。
#include <iostream>
#include <vector>

using namespace std;

int main(){

    vector<int> VectorName;

    VectorName.push_back(2);
    VectorName.push_back(3);

    cout << VectorName.at(1) << endl;
    VectorName.pop_back();

    cout << VectorName.at(1) << endl;

    return 0;
}