Как исправить ошибку доступа к памяти - PullRequest
0 голосов
/ 22 декабря 2008

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

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

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

Ответы [ 4 ]

1 голос
/ 22 декабря 2008

Строка ниже выглядит неправильно для меня

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

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

stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();
1 голос
/ 22 декабря 2008

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

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

0 голосов
/ 22 декабря 2008

Я использую компилятор 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;
0 голосов
/ 22 декабря 2008

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

...