导致Seg Fault的地图。如何增加记忆力?

时间:2011-07-06 19:17:40

标签: c++ memory memory-management map segmentation-fault

我有一个简单的问题。我有几个文件,一个文件大约20000行 它有5个字段,有一些其他adt(向量和列表),但那些不会导致段错误。 地图本身将存储一个键值,相当于每行约1个。 当我在我的代码中添加了一个地图时,我会立即得到一个段错误,我复制了5000个20000行,然后收到了一个段错误,然后是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();
} 

4 个答案:

答案 0 :(得分:6)

分段错误并不一定表示您内存不足。事实上,对于C ++,它非常不可能:在这种情况下,你通常会得到一个bad_alloc或者某些东西(除非你将所有内容都转储到具有自动存储持续时间的对象中?)。 / p>

更有可能的是,您的代码中存在内存损坏错误,恰好发生只有当您拥有超过一定数量的对象时才会显而易见。

无论如何,内存故障的解决方案不是盲目地在程序中投入更多内存。

通过valgrind和调试器运行代码,看看真正的问题是什么。

答案 1 :(得分:1)

一般来说,在C \ C ++中,最大可用堆量在程序启动时没有固定 - 您可以通过直接使用new/malloc或使用STL容器来分配更多内存,例如stl::list,它可以自己完成。

答案 2 :(得分:1)

在迭代容器时,小心擦除容器中的元素。

for (pos = ava_bw.begin(); pos != ava_bw.end(); ++pos) {
    if (pos->second == INIT){
      ava_bw.erase(pos);
    }
  }

我相信这会pos指向下一个值,但++pos会再次推进它。如果erase(pos)导致pos指向ava_bw.end(),则++pos将失败。

我知道如果您尝试使用向量,pos将无效。

修改

在while循环中你做

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();
}

您需要再次flw = endQueue.top()

答案 3 :(得分:0)

我不认为问题是内存,因为C ++会获得尽可能多的内存,甚至可以占用PC上的所有可用内存。看看您delete稍后访问的内容。