Ошибка сегментации после использования оператора new

У меня есть код C ++, созданный для цели ARM с использованием набора инструментов 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

1

Решение

Это может быть повреждение кучи (объяснение, почему malloc завершает процесс).

Используйте свои обычные инструменты для обнаружения неопределенного поведения (например, плохого доступа к памяти).

Если обработка исключений пошла не так (не слишком необычно в присутствии стресс-факторов ABI, таких как кросс-компиляция), вы можете использовать nothrow версия operator new:

X* x = new (nothrow) X;

assert(x); // or otherwise handle with care
0

Другие решения

new создает исключение, если недостаточно памяти. Но в журнале нет исключений.
Так что я полагаю, что памяти достаточно. Более вероятный ответ: вы как-то повредили память.
Вы должны проверить доступ к вашей памяти с помощью Valgrind

Больше всего меня беспокоит прототип оператора =; MyMsg::operator=(MyPkt*),
Почему брать указатель, а не константную ссылку на объект? Или хотя бы const MyPkt const *

0

По вопросам рекламы [email protected]