Как исправить ошибку доступа к памяти

Я работаю над проектом миграции, здесь мы переносим большой набор библиотек C++ с мэйнфрейма на Solaris. Мы успешно выполнили миграцию, но при запуске приложения в некоторых местах происходит сбой с «сигналом SEGV (нет сопоставления по адресу ошибки)».

Поскольку приложение также поддерживает Windows, мы проверили очистку в Windows. В приложении нет утечек памяти, и оно отлично работает на windows.

Может ли кто-нибудь предложить, каковы могут быть другие причины, которые могут создавать этот тип ошибок. Есть ли инструменты для отслеживания этого типа ошибок?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 225
4

Ответы 4

Вы используете g ++? Если да, перекомпилируйте с флагом "-g". Запустите программу в gdb. Когда он выйдет из строя, введите «bt» (для обратной трассировки), и это должно сказать вам, где ваша проблема.

Это не обязательно утечка памяти. Может случиться так, что часть памяти называется после, она свободна.

Однажды мой друг пришел ко мне с фрагментом кода, который отлично работает в Windows, но дает segv в Linux. Оказалось, что иногда память остается действующей после того, как вы освободили ее в Windows (вероятно, в течение короткого периода времени), но сразу же запускал segv в Linux.

Я использую компилятор CC на отладчике solaris и dbx. Я знаю стек вызовов, в котором происходит сбой. Но это ужасная авария.

map<string,CDBBindParam,less<string> >m_BindMap;



CNumString ns(CNumStringTraits(0,2,'0'));
ns = m_BindMap.size();
string sLabel = ":BIND"+ns;
CDBBindParam b(sLabel,val);
**m_BindMap[sLabel] = b;**   // crashes at this line at when map size is more than 2
return sLabel;

Строка ниже кажется мне неправильной

m_BindMap[sLabel] = b;   // crashes at this line at when map size

Я предполагаю, что вы пытаетесь добавить число в конец строки. Попробуйте вместо этого

stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();

«: BIND» + ns означает «ns» байтов после начала «: BIND». Когда ns> 6, вы попадаете в страну лала. Однако не уверен в ns> 2.

user3458 22.12.2008 18:55

Другие вопросы по теме