【发布时间】:2011-09-29 21:53:25
【问题描述】:
我有一个简单的问题。我有几个文件,一个文件大约 20000 行。
它有 5 个字段,还有一些其他的 adt(向量和列表),但这些不会导致段错误。
地图本身将存储一个键值,相当于每行大约 1 个。
当我在我的代码中添加地图时,我会立即得到一个段错误,我复制了 20000 行中的 5000 行,然后收到一个段错误,然后是 1000 行,并且它起作用了。
在 java 中有一种方法可以增加虚拟分配的内存量,有没有在 c++ 中这样做的方法?我什至删除了不再使用的元素,我可以得到大约 2000 行,但不会更多。
这里是 gdb:
(gdb) exec-file readin
(gdb) run
Starting program: /x/x/x/readin readin
Program exited normally.
valgrind:
HEAP SUMMARY:
==7948== in use at exit: 0 bytes in 0 blocks
==7948== total heap usage: 20,206 allocs, 20,206 frees, 2,661,509 bytes allocated
==7948==
==7948== All heap blocks were freed -- no leaks are possible
代码:
....
Flow flw = endQueue.top();
stringstream str1;
stringstream str2;
if (flw.getSrc() < flw.getDest()){
str1 << flw.getSrc();
str2 << flw.getDest();
flw_src_dest = str1.str() + "-" + str2.str();
} else {
str1 << flw.getSrc();
str2 << flw.getDest();
flw_src_dest = str2.str() + "-" + str1.str();
}
while (int_start > flw.getEnd()){
if(flw.getFlow() == 1){
ava_bw[flw_src_dest] += 5.5;
} else {
ava_bw[flw_src_dest] += 2.5;
}
endQueue.pop();
}
【问题讨论】:
-
发布您的代码。它在某个地方坏了......
-
您确定分段错误是由于内存分配问题造成的吗?您是否在 GDB 中运行过代码?在 1,000 个条目后,地图似乎不太可能失败。
-
如果您在现代虚拟内存环境中执行此操作,问题在于处理映射的代码,而不是内存不足。在 Linux 中,会出现内存限制的资源错误,而不是 SEGFAULT。
-
我没用过调试的,让我试试,我会回复大家的。
-
是
std::map还是您推出了自己的地图类?由于任何标准 C++ 容器,您都不太可能看到分段错误。我们需要看一些代码...
标签: c++ memory memory-management map segmentation-fault