C++向量上的分配错误

allocation error on C++ vector

本文关键字:分配 错误 向量 C++      更新时间:2023-10-16

我正在尝试分配一个包含自身vector<AnotherClass>vector<vector<Class>>,但我得到了一个分配错误,所以我的问题是:变量上给出的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);
}
}
}

我有一个 357M <500M 的max_size,我应该创建。

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

#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,在我的原始代码中我需要这个函数。

vector::max_size()与在没有任何其他内存使用的情况下单个向量可以获得多大有关。您的向量都没有达到该大小。最大的是5000,个人分配5000 * max(sizeof(vector<Case>), sizeof(Case))对我来说是80,000。

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

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

您应该将std::vector<T>::size_type用于数组索引

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

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

以 64 位编译代码,如果您有必要的内存,您的代码将运行。

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

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