C++ 为什么下面的代码抛出std::bad_alloc?

C++ 为什么下面的代码抛出std::bad_alloc?,c++,c++11,out-of-memory,bad-alloc,C++,C++11,Out Of Memory,Bad Alloc,我编写了代码来测试两个数组中有多少相同的数字,但出于某种原因,它抛出了“std::bad_alloc”,有人能解释一下原因吗?它只在N=1000000时抛出它,是因为我分配了4000000字节的内存吗 代码如下: #include <iostream> #include <vector> #include <string> #include <random> #include <algorithm> #include <math.

我编写了代码来测试两个数组中有多少相同的数字,但出于某种原因,它抛出了“std::bad_alloc”,有人能解释一下原因吗?它只在N=1000000时抛出它,是因为我分配了4000000字节的内存吗

代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <random>
#include <algorithm>
#include <math.h>
#include <iomanip>

using namespace std;

int find_last_before_zero(const vector<int>& vec) {
 for (int i = vec.size() - 1; i >= 0; --i) {
    if (vec[i] != 0) return i + 1;
 }
return vec.size();
}

void gen_random_array(vector<int>& vec){
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dist(100000, 100200);

for(int i = 0; i < vec.size(); ++i){
    vec[i] = dist(gen);
}
}

void binSearchClient(int T){
int counters[4] = {0,0,0,0};
string names[4] = {"for n = 1000 = ", "for n = 10000 = ", "for n = 100000 = ", "for n = 1000000 = "};
for(int i = 0; i < T; ++i){
    int N = 1000;
    for(int k = 0; k < 4; ++k){
        N *= pow(10.0, k);
        vector<int> first(N), second(N);
        gen_random_array(first, N); gen_random_array(second, N);
        vector<int> intersection(N);
        sort(first.begin(), first.end()); sort(second.begin(), second.end());
        set_intersection(first.begin(), first.end(), second.begin(), second.end(), intersection.begin());
        counters[k] += find_last_before_zero(intersection);
            }
        }
    }
}
for(int i = 0; i < 4; ++i){
    cout << names[i] << setprecision(10) << std::fixed << (1.0 * counters[i]) / T << endl;
}
}

int main(){
binSearchClient(1);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int find_last_在_zero之前(常量向量和向量){
对于(int i=vec.size()-1;i>=0;--i){
如果(vec[i]!=0)返回i+1;
}
返回向量大小();
}
void gen_随机_数组(向量和向量){
随机器件rd;
mt19937 gen(rd());
统一国际配送区(100000、100200);
对于(int i=0;i在你的第一次迭代中,N是1000。然后在
for(intk=0;k<4;++k)
中,你做
N*=pow(10.0,k);
。所以在第一次迭代中
N=1000(N(1000)*10^0)
k变成1,你
N=10000(N(1000)*10^1)
。然后k变成2,N=1000000(N(N(10000)*10^2)
。当k=3时,您得到
N=10000000000000(N(1000000)*10^3)
这很可能是你无法分配的内存。

当你搜索时,你发现了什么?你在哪个平台上运行,你会期望这样大小的分配在那里成功吗?你是否尝试过以不同的方式分配相同数量的内存进行比较?
std::bad_alloc
表示内存分配失败。这通常是当您的内存不足或至少没有足够的连续内存进行大的分配时,就会发生这种情况。您分配的内存是否过多?您有多少空闲内存?在哪一行引发异常?我确信您可以进一步缩小此范围。@JonathanWakely我的visual studio 2010没有告诉我引发异常的原因和原因糟透了。所以不,不会更快。什么,每个人都没有PB的内存?