矢量无效的分配大小

Inc*_*bus 4 c++ size stl vector std

当我尝试创建和调整向量以保持最大项目数(vector :: max_size())时,我在运行时遇到调试错误:

"无效的分配大小:429467292"

我想知道为什么你不能调整大小,如果max_size()应该返回向量中的最大项目数...

vector<int> vc;
vc.resize(vc.max_size());
Run Code Online (Sandbox Code Playgroud)

我也尝试启用LARGADRESSAWARE:在VS2010中启用,但这没有帮助.想知道这是否是一个正确的thoguth ...

有人知道吗?

Jam*_*lis 5

max_size()是矢量可以存储的绝对最大元素数.使用默认分配器,通常是这样std::numeric_limits<std::size_t>::max() / sizeof(T).也就是说,它是您可能创建的最大类型的数组.

但是,您实际上永远无法分配那么大的数组.程序加载的模块占用了程序的一些地址空间,每个线程的堆栈也是如此.您可能在程序中有其他动态分配的对象(由您或运行时分配).这些都有助于解决空间碎片问题,这意味着可用地址空间的最大连续块远小于可用地址空间的总量.

简而言之,在实践中不可能分配vectormax_size()元素.

  • 内存映射I/O不会突然为程序提供更多地址空间.在32位进程中,您有4GB的地址空间.`std :: vector`需要一个大的连续分配,因此地址空间碎片是限制因素.在64位进程中,理论上存在同样的问题,但实际上由于地址空间太大,所以问题并不多. (2认同)