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;
}