C++ 向量无效分配大小

C++ 向量无效分配大小,c++,stl,vector,size,std,C++,Stl,Vector,Size,Std,当我尝试创建并调整向量大小以容纳最大项数(vector::max_size())时,我在运行时遇到一个调试错误: “无效的分配大小:429467292” 我想知道为什么你不能调整这个,如果max_size()应该返回向量中的最大项数 vector<int> vc; vc.resize(vc.max_size()); 向量vc; 调整大小(vc.max_size()); 我还尝试在VS2010中启用LARGADRESSAWARE:On,但这没有帮助。想知道这是否是一个正确的想法 有

当我尝试创建并调整向量大小以容纳最大项数(vector::max_size())时,我在运行时遇到一个调试错误:

“无效的分配大小:429467292”

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

vector<int> vc;
vc.resize(vc.max_size());
向量vc;
调整大小(vc.max_size());
我还尝试在VS2010中启用LARGADRESSAWARE:On,但这没有帮助。想知道这是否是一个正确的想法

有人知道线索吗?

max\u size()
是向量可以存储的元素的绝对最大数量。使用默认分配器,这通常是std::numeric\u limits::max()/sizeof(T)。也就是说,它是您可能创建的该类型的最大数组

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


简言之,实际上不可能使用
max_size()
元素分配
向量。

除了其他问题,您可能需要编译32位
429467292
可能是可以处理的最大索引,但实际上,由于32位内存的限制,您将无法获得任何需要的索引。在windows中使用文件映射或类似的方法是否有可能实现这一点?。。。可以将std::vector使用的内存重定向到这个文件映射机制吗?内存映射I/O不会突然给程序更多的地址空间。在32位进程中,您有4GB的地址空间
std::vector
需要一个大的连续分配,因此地址空间碎片是限制因素。在64位进程中,理论上也会遇到同样的问题,但在实践中,由于地址空间太大,所以问题不大。