使用运算符 new 后出现分段故障
Segmentaion fault after using operator new
我有一个为ARM目标构建的C++代码,使用linaro工具链专门为ARM硬件目标构建(使用softfp,mtune=cortex-a9等)有时,代码会崩溃并带有以下跟踪。我已将 gdb 附加到正在运行的进程显然,在调用来自libstdc++.so.6的新运算符后,它似乎使一些调用崩溃。
我们目前没有异常处理代码,所以如果 new 失败并抛出异常,我认为它会中止/终止,并显示如下消息:
Program received signal SIGABRT, Aborted.
但相反,它与SIGSEGV一起崩溃。
为什么会这样?可能出现什么问题?
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x45c6b460 (LWP 1182)]
0x402fad12 in malloc_consolidate () from /lib/libc.so.6
#0 0x402fad12 in malloc_consolidate () from /lib/libc.so.6
#1 0x402fc498 in _int_malloc () from /lib/libc.so.6
#2 0x402fe414 in malloc () from /lib/libc.so.6
#3 0x401f54d6 in operator new(unsigned int) () from /lib/libstdc++.so.6
#4 0x400f30d4 in MyMsg::operator=(MyPkt*) () from /usr/lib/libmy-ARMV7AL.so
#5 0x400f322c in MyMsg::reply() () from /usr/lib/libmy-ARMV7AL.so
#6 0x0005a6a0 in MyManager::SendMessage (this=0x7188c8)
at MyManager.cpp:12973
#7 0x0004389c in My::Response (this=0x7188c8)
MyManager.cpp:5972
它可能是堆损坏(解释为什么 malloc 终止进程)。
使用常规工具检测未定义的行为(例如错误的内存访问)。
如果异常处理出错(在存在交叉编译等 ABI 压力源的情况下不太罕见),您可以使用nothrow
版本的 operator new
:
X* x = new (nothrow) X;
assert(x); // or otherwise handle with care
new 如果没有足够的内存,则会引发异常。但日志中没有例外。所以我想有足够的内存。更可能的答案是你以某种方式破坏了记忆。你应该用valgrind检查你的内存访问
更困扰我的是 = 运算符的原型; MyMsg::operator=(MyPkt*)
.为什么在对象上取指针而不是常量引用?或者至少const MyPkt const *
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数
- C++分段故障BST