导致Seg故障的地图.如何增加内存

Map causing Seg Fault. How to increase memory?

本文关键字:增加 内存 何增加 Seg 故障 地图 导致      更新时间:2023-10-16

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

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

更有可能的是,你的代码中有一个内存损坏错误,只有当你有超过一定数量的对象时,才会出现。

无论如何,内存故障的解决方案不是盲目地向程序抛出更多内存

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

在遍历容器时,请小心从容器中擦除元素。

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

一般来说,在C\C++中,可用堆的最大数量在程序开始时并不是固定的——您总是可以通过直接使用new/malloc或使用STL容器(如stl::list(来分配更多的内存,这些容器可以自己完成。

我不认为内存有问题,因为C++获得了它所要求的内存,甚至占用了你电脑上所有可用的内存。看看你是否delete以后访问的东西。