Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个向量构造函数抛出std::bad_alloc异常? #包括 #包括 使用名称空间std; 无效测试\u错误\u分配(无符号字符*开始){ 试一试{ 向量v=向量(开始+1,开始-13); }捕获(错误分配){ std::cout_C++_Vector_Bad Alloc - Fatal编程技术网

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/异常。例如,最新的CLAN抛出<代码> STD::LangthyOrthue,最新的Visual C++只是崩溃。它还取决于编译器标志。

在您的例子中可能发生的情况是,编译器生成了二进制代码,该代码只是继续使用无效指针并将其传递给向量构造函数,然后向量构造函数尝试从中创建一个巨大的整数范围,但失败了

也许你是想做这样的事

#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());