Jim*_*Jim 1 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.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
码:
....
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();
}
Run Code Online (Sandbox Code Playgroud)
分段错误并不一定表示您已经内存不足.实际上,使用C++,它是非常不可能的:bad_alloc在这种情况下你通常会得到一个或者某些东西(除非你将所有内容都转储到具有自动存储持续时间的对象中?!).
更有可能的是,你在你的代码中的内存破坏漏洞,这恰好只出现明显当你有超过一定数量的对象多.
无论如何,内存故障的解决方案不是盲目地在程序中投入更多内存.
通过valgrind和调试器运行代码,看看真正的问题是什么.