C ++向量上的分配错误

时间:2017-07-18 08:21:03

标签: c++ vector

我正在尝试分配一个vector<vector<Class>>,其中包含vector<AnotherClass>,但我得到了分配错误,所以我的问题是:变量上的max_size()适用于所有我的程序的载体?

我可以通过更改编译器来更改此限制吗?

这里我用来检查的代码:

class Couches
{
public:
    Couches() : m_value(-1) {}
    ~Couches() {}

    void initialize(const int& value) {
        m_value = value;
    }
private :
    int m_value;
};

class Case
{
public :
    Case() {}
    ~Case() {}

    void initialize(const int& hauteur) {
        m_couches.resize(hauteur);
        for (int i(0); i<hauteur;i++)
            m_couches[i].initialize(i);
    }
private :
    vector<Couches> m_couches;
};


void bug1()
{
    vector<vector<Case>> m_cases;
    m_cases.resize(5000, vector<Case>(5000));

    cout<< m_cases.max_size()<<" " <<5000*5000*20<<endl;

    for (int i(0); i<m_cases.size(); i++)
    {
        for (int j(0); j<m_cases[i].size(); j++)
        {
            m_cases[i][j].initialize(20);
        }
    }
}

我的max_size为357M&lt;预计我将创造500M。

编辑:对不起伙计我说错误,但这是调试器给出的错误:

#1 0x405b36 operator new(unsigned int) () (??:??)

#2 0x490f58 typeinfo for std::time_put<wchar_t, std::ostreambuf_iterator<wchar_t, std::char_traits<wchar_t> > > () (??:??)

#3 0x4761ac std::allocator_traits<std::allocator<Couches> >::allocate(__a=..., __n=0) (D:/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/alloc_traits.h:357)

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

我使用初始化函数,因为它是一个mcve,在我的原始代码中我需要这个函数。

3 个答案:

答案 0 :(得分:1)

max_size()是可以放在向量中的最大项目数,此数字受系统位的限制。如果您使用的是2^32 char值的32位系统。您正在达到系统或库实施限制,这就是您获得375M

的原因

您应该使用std::vector<T>::size_type作为数组索引

答案 1 :(得分:1)

我想你是用32位编译代码的。

这是猜测,为什么将341M作为max_size。典型的实现将获得SIZE_MAX / sizeof(element_size)的值。 SIZE_MAX是4GB-1。并检查包含另一个向量的向量的max_size()值。典型的sizeof(向量)是12.因此,给定的答案是4GB / 12 = 341M。注意:实现可以提供它想要的任何max_size值。

以64位编译代码,如果你有必要的内存,你的代码就会运行。

注意:在您的代码中,您不必担心max_size(),因为您的向量不包含那么多元素。我的意思是,没有单个矢量实例,它有很多元素。问题是你的总内存消耗很大,不适合~2GB,这是32位的典型最大允许进程大小。所以我认为你的程序内存不足,矢量大小没有问题。

注2:我使用过M = 2 ^ 20,G = 2 ^ 30

答案 2 :(得分:1)

vector::max_size()单个向量有多大关系,在没有任何其他内存使用的情况下。没有一个向量接近这个大小。最大的是5000,个人分配5000 * max(sizeof(vector<Case>), sizeof(Case)),对我来说是80,000。

您看到的错误是所有25,000,000 Cases和500,000,000 Couches的总分配超出了程序中的地址空间