C++ 为什么这个向量构造函数抛出std::bad_alloc异常? #包括 #包括 使用名称空间std; 无效测试\u错误\u分配(无符号字符*开始){ 试一试{ 向量v=向量(开始+1,开始-13); }捕获(错误分配){ std::cout
由C++ 为什么这个向量构造函数抛出std::bad_alloc异常? #包括 #包括 使用名称空间std; 无效测试\u错误\u分配(无符号字符*开始){ 试一试{ 向量v=向量(开始+1,开始-13); }捕获(错误分配){ std::cout,c++,vector,bad-alloc,C++,Vector,Bad Alloc,由vector(ptr1,ptr2)调用的构造函数是带有两个迭代器的范围构造函数。它尝试为从ptr1开始并在ptr2之前结束的元素分配内存。但由于ptr2小于ptr1,因此分配的元素数为负数 由于ptr2=start-13将引用分配的数组之外的内容,我猜您希望ptr2=start+13您的程序在尝试评估start-13时具有未定义的行为 start指向a数组的第一个元素,因此start-13创建了一个无效的指针,因为它超出了数组的界限。您根本无法这样做,也没有意义。您希望指针指向什么 请注意,即
vector(ptr1,ptr2)
调用的构造函数是带有两个迭代器的范围构造函数。它尝试为从ptr1开始并在ptr2之前结束的元素分配内存。但由于ptr2小于ptr1,因此分配的元素数为负数
由于
ptr2=start-13
将引用分配的数组之外的内容,我猜您希望ptr2=start+13
您的程序在尝试评估start-13
时具有未定义的行为
start
指向a
数组的第一个元素,因此start-13
创建了一个无效的指针,因为它超出了数组的界限。您根本无法这样做,也没有意义。您希望指针指向什么
请注意,即使不取消对指针的引用
在任何情况下,未定义的行为意味着您的程序可以做任何事情,“任何事情”包括抛出随机异常
实际上,我不能复制<代码> STD::BADYOLLC/
#include <iostream>
#include <vector>
using namespace std;
void test_bad_alloc(unsigned char *start) {
try {
vector<int> v = vector<int>(start + 1, start - 13);
}catch (bad_alloc) {
std::cout<<"bad alloc"<<std::endl;
}
}
int main() {
unsigned char a[20] = {0};
test_bad_alloc(a);
return 0;
}
void test\u bad\u alloc(无符号字符*开始,无符号字符*结束){
试一试{
向量v=向量(开始+1,结束-13);
}捕获(错误分配){
std::cout问题在vector v=vector(开始+1,开始-13);
范围构造函数期望
vector<int> v(start + 1, end - 13);
i、 e.从第一个元素到最后一个元素。但是,您使用的是start-13
而不是SecondIterator,它位于分配数组的内存空间之外
在最好的情况下,它也可能超出进程的内存空间,并可能导致分段错误,在最坏的情况下,它可能会获取垃圾值、用错误数据覆盖文件或通过套接字发送错误消息。对不起,有一个错误:test_bad_alloc(a);我已经为您编辑了这个问题,但下次请您自己编辑这个问题。为什么这是最坏的情况?这是最好的情况,因为它会立即终止程序,而不是使用垃圾值、用错误数据覆盖文件或通过套接字发送错误消息。它告诉您,有一个错误需要修复,而不是删除只是“不稳定”和“奇怪”。根据您的建议进行必要的更改。
vector<int> v(start + 1, end - 13);
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());