c++ - 映射导致段错误。如何增加内存力?

标签 c++ memory memory-management dictionary segmentation-fault

我有一个简单的问题。我有几个文件,一个文件大约 20000 行。
它有 5 个字段,还有一些其他的 adt( vector 和列表),但这些不会导致段错误。 map 本身将存储一个键值,相当于每行约 1 个。 当我在我的代码中添加一个映射时,我会立即得到一个段错误,我复制了 20000 行中的 5000 行,并收到一个段错误,然后是 1000 行,它起作用了。

在 Java 中有一种方法可以增加虚拟分配的内存量,在 C++ 中有没有办法这样做?我什至删除了不再使用的元素,我可以得到大约 2000 行,但不会更多。

这是 gdb:

(gdb) exec-file readin
(gdb) run
Starting program: /x/x/x/readin readin

Program exited normally.

瓦尔格林德:

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 和调试器运行您的代码,看看真正的问题是什么。

关于c++ - 映射导致段错误。如何增加内存力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6601725/

相关文章:

c++ - 我怎样才能看到我的程序占用了多少内存?

java - 循环 MD5 计算时缓慢且内存泄漏

ios - NSURLSession 失效并取消 : Bad Access

c++ - 如何正确释放placement new分配的内存?

c++ - *** 检测到 glibc *** free() : invalid pointer:

c++ - 使用 boost iostream socket 读写文件

c++ - 如何使用 glibc 的字符串实现在堆栈上分配 std::string?

python - Python 中的大小递增 Numpy 数组

.net - MemoryCache如何知道它使用了多少内存?

c++ - 如果 EBP 帧指针为 NULL,堆栈是否已损坏?