导致Seg故障的地图.如何增加内存
Map causing Seg Fault. How to increase memory?
我有一个简单的问题。我有几个文件,其中一个文件大约有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
以后访问的东西。
- 内存增加和字符串流?
- ActiveMQ使用者的内存使用量在onMessage调用后不断增加
- SQLite C/C++ 接口:将数据插入表时内存增加
- 为什么将鼠标悬停在静态 Win32 控件上会增加内存并删除我的 GUI?
- 标准::矢量增加峰值内存
- 打开文件*以增加内存空间
- 使用新线程池而无需重新启动的新线程池后,Jemalloc的内存大大增加
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- C :当居民记忆缓慢增加时,是否存在内存泄漏
- 程序C++中的虚拟内存大小增加
- FFMPEG 内存增加
- 如何增加机器的内存和CPU消耗
- 为什么在保留向量中插入空结构会增加内存
- 为什么 q网页测试的内存一直在增加?
- Win32 C++中的DrawText会增加内存使用率
- 内存占用增加
- Qt qml 应用程序增加内存使用量
- 内联函数是如何增加内存缓存未命中的,以及与替代函数相比,它为什么不好
- 导致Seg故障的地图.如何增加内存
- 增加内存映射文件的大小