【问题标题】:bad_alloc while initializing and filling a vector?bad_alloc 在初始化和填充向量时?
【发布时间】:2013-01-22 20:41: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
}

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

【问题讨论】:

    标签: c++ exception memory-management vector


    【解决方案1】:

    v.push_back 增加了大小,所以i&lt;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循环的情况下必须修改以检查容量而不是大小。
    • 我认为检查capacity 不是一个好主意,因为据我所知reserve允许过度分配的(即使实际上可能不会正在做)。而只是检查size(函数参数)。
    • 但生成效果很好,从维护的角度来看更清晰。为什么不好?
    • @den-javamaniac 嗯?谁说generate 不好?这确实是您问题的最佳解决方案,它与您的实际问题完全无关,此答案已正确回答。
    • @ChristianRau,误解了关于生成的声明,谢谢。
    【解决方案2】:

    放大以下部分:

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

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

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

    【讨论】:

    • 你应该提到你的后一个建议增加了向量而不修改原始内容。
    • 我怀疑 OP 实际上想要一百个零,后跟一百个伪随机数。
    • 对。问题是关于 bad_alloc,而不是如何更新元素。虽然你所有的建议都是有效的:)
    • 看起来 OP 很聪明,并且已经进行了适当的测试,如果不需要前导零,则可以捕获。
    猜你喜欢
    • 2014-10-04
    • 2014-02-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2012-01-14
    • 2022-01-02
    相关资源
    最近更新 更多