初始化和填充向量时bad_alloc

bad_alloc while initializing and filling a vector?

本文关键字:bad alloc 向量 填充 初始化      更新时间:2023-10-16

在尝试生成随机数向量时,我偶然发现了一个std::bad_alloc错误。这是我的代码:

#include "search.h"
#include "gtest/gtest.h"
int _size = 100;
std::vector<int> GetSortedVector(int size){
    //init vector
    std::vector<int> v(size);
    //fill with random numbers
    for (std::vector<int>::size_type i=0; i < v.size(); i++)
        v.push_back( std::rand()%(2*size) );
    //return the setup vector
    return v;
}
//triggered automatically
TEST(BinarySearch, NonUniqueSorted){
    std::vector<int> v = GetSortedVector(_size);//nothing moves farther than this line
}

PS:我现在确实使用generate(),但仍然很好奇为什么它失败了。

v.push_back会增加大小,因此i<v.size()永远不会false

由于您的矢量长度已经size,因此您需要用

for (std::vector<int>::size_type i=0; i < v.size(); i++)
    v[i] = std::rand()%(2*size);

或改用reserve

std::vector<int> v;
v.reserve(size);

保持push_back并检查size。我不会建议std::generate因为你说你已经这样做了。

放大到以下部分:

for (std::vector<int>::size_type i=0; i < v.size(); i++)
        v.push_back( std::rand()%(2*size) );

每次调用push_back()时,向量的大小都会增加 1。因此,i < v.size()永远不会计算为 false,并且您的循环将继续,直到内存不足。修复它的可能方法之一是捕获size()一次,例如:

for (std::vector<int>::size_type i=0, s = v.size(); i < s; i++)
        v.push_back( std::rand()%(2*size) );