我正在尝试分配一个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,在我的原始代码中我需要这个函数。
答案 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
的总分配超出了程序中的地址空间