【发布时间】:2013-03-18 13:10:35
【问题描述】:
我正在尝试在 stl 集中插入超过 650 万个元素(整数)。代码如下:
set<int> s;
cout << s.max_size() << endl;
for(int i = 0; i < T.MULT * T.MAXP; i++) {
s.insert(a[i]);
}
T.MULT 是10; T.MAXP 是 666013。
a 是一个数组 - 静态分配 - (int a[T.MULT * T.MAXP];),其中包含不同的元素。
在大约 460 万个元素之后,s.insert() 引发 bad_alloc 异常。 Windows 7 上可用的资源监视器说我还有 3 GB 可用内存。
我究竟做错了什么?为什么 STL set 不能分配内存?
编辑:这里是完整代码:http://ideone.com/rdrEnt
Edit2:显然插入的元素毕竟可能并不明显,但这应该不是问题。
Edit3:这是代码的简化版本:http://ideone.com/dTp0fZ
【问题讨论】:
-
任务管理器为您的进程的工作集报告什么?您的代码是编译为 32 位还是 64 位代码?
-
很可能,您的进程虚拟内存不足。这是什么平台?
-
@JoachimPileborg:不需要
std::set的大块,你只需要足够的节点大小。 -
这应该可以。可能其他一些代码正在破坏堆。
-
请显示a short, self-contained, compilable example 并准确说明您正在使用哪些工具(编译器、版本、目标机器、操作系统等)。可能是您程序中的其他东西干扰了此代码。我能够在 OS X 上毫无问题地编译和执行它(在用数字替换
T.MULT和T.MAXP并定义a之后)。