为什么下面的代码会抛出 std::bad_alloc
Why does the following code throw std::bad_alloc?
我已经编写了代码来测试两个数组中存在多少个相同的数字,但由于某种原因,它抛出"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);
}
在第一次迭代中,将 N 设置为 1000。 然后在for(int k = 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 = 1,000,000 (N(10000) * 10^2)
. 在 k = 3 时,你会得到N = 1,000,000,000,000,000 (N(1,000,000) * 10^3)
这很可能是你能分配的内存。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- "std::vector"在调整大小时引发"bad allocation"异常
- 成员函数 bad() 的 std::ftsream 用于检查
- 正在使用std::string而不是char*bad
- 在抛出 'std::bad _alloc' 的实例后调用终止 what(): std::bad_alloc 在 c++ 中
- What is Scala for: getline(), std::cin.eof(), std::cin.bad()