我的程序失败了:
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc
我想这与malloc
/ free
有关,但我不知道是哪一个。
我可以在gdb中设置什么断点来破坏错误,以便我可以查看堆栈跟踪?
该程序是C和C ++的组合,使用gcc 3.4.2编译。
答案 0 :(得分:13)
它不是真正的malloc / free导致异常,它是“new”,它绝对是你应用程序的C ++部分。看起来您提供的参数太大而无法分配“新”。
'std :: bad_alloc'由以下代码引起,例如:
int * p = new int[50000000];
将崩溃转储加载到gdb时,backtrace会说什么? 如果您无法生成转储,则可以要求GDB停止when exception is thrown or caught。 不幸的是,某些版本的GDB仅支持以下语法:
catch throw
允许您在抛出任何异常时中断应用程序。 但是,在帮助中,您可以看到应该可以运行
catch throw std::bad_alloc
在较新的版本中。
不要忘记:
(gdb)帮助抓住
是其他有用信息的良好来源。
答案 1 :(得分:0)
很可能由于某些内存被覆盖而发生这种情况,从而破坏了内存分配系统的状态(通常在内存块返回应用程序之前或之后保存)。
如果您有可能(即,您使用的是x86 Linux),请在Valgrind中运行您的程序,它通常可以准确显示损坏发生的位置。
答案 2 :(得分:0)
我尝试读取一个不存在的文件时已经有了这个...我会尝试为文件内容创建一个内部缓冲区,但由于该文件不存在,我创建了缓冲区搞砸了。
int lenth_bytes;
length_bytes = in_file.tellg();
new char [length_bytes]; // length_bytes hadn't been initialised!!!!
记住孩子,总是初始化你的变量:D并检查零个案例。