У вас проблема с выравниванием данных.Скорее всего, это вызвано попыткой чтения или записи через какой-либо неверный указатель.
Проблема с выравниванием данных заключается в том, что адрес, на который указывает указатель, не «правильно» выровнен.Например, некоторые архитектуры (например, старый Cray 2) требуют, чтобы любая попытка чтения из памяти чего-либо, кроме одного символа, осуществлялась только через указатель, в котором последние 3 бита значения указателя равны 0. Если какой-либо из последних3 бита равны 1, аппаратное обеспечение сгенерирует ошибку выравнивания, что приведет к возникновению проблемы, которую вы видите.
Большинство архитектур не столь строги, и зачастую требуемое выравнивание зависит от того, какой именно типдоступ.Например, 32-разрядное целое число может требовать, чтобы только 2 последних бита указателя были равны 0, но 64-разрядное значение с плавающей запятой может требовать, чтобы последние 3 бита были равны 0.
Проблемы выравнивания обычно вызваны тем жевиды проблем, которые могут вызвать SEGFAULT или ошибку сегментации.Обычно указатель, который не инициализирован.Но это может быть вызвано плохим распределителем памяти, который не возвращает указатели с правильным выравниванием, или результатом арифметики указателя на указателе, когда он не имеет правильного типа.
Реализация системыиз malloc
и / или operator new
почти наверняка верны, иначе ваша программа будет аварийно завершена раньше, чем в данный момент.Поэтому я думаю, что плохой распределитель памяти - это наименее вероятное дерево, которое будет лаять.Сначала я бы проверил наличие неинициализированного указателя, а затем неверную арифметику указателей.
В качестве примечания, архитектуры x86 и x86_64 не имеют требований к выравниванию.Но из-за того, как работают строки кэша, а также по ряду других причин, часто для производительности рекомендуется выровнять данные по границе, равной размеру хранимого типа данных (то есть 4-байтовой границе для 32-битного целого).