Ошибка сегментации при вызове wxThread :: OnExit ()

Обновление 2: Смотрите раздел после моего кода.

Я использую поток для вычисления PI, используя библиотеку GMP, но каким-то образом я теперь получаю ошибку сегментации, когда wxThread::OnExit() внутренне в wxWidgets называется.

Вот строка в исходном коде wxWidgets: SRC / MSW / thread.cpp # 553

Вот сокращенный код из моей функции записи потока:

while (i <= m_numIterations && !TestDestroy()) {
mpf_div(result, perimeter, edgeCount);

mpf_pow_ui(result, result, 2);
mpf_ui_sub(result, 1, result);
mpf_sqrt(result, result);
mpf_div_ui(result, result, 2);

mpf_sub(result, half, result);
mpf_sqrt(result, result);
mpf_mul_ui(result, result, 2);
mpf_mul(result, result, edgeCount);

mpf_set(perimeter, result);

i++;
mpf_mul_ui(edgeCount, edgeCount, 2);
}

// Free GMP variables we don't need anymore
mpf_clear(half);
mpf_clear(result);
mpf_clear(edgeCount);

// OUTPUT_DIGITS has a constant value, e.g. 12
char outputStr[OUTPUT_DIGITS];

mp_exp_t *expptr;

// If commented out, the error does not appear!
mpf_get_str(outputStr, expptr, 10, OUTPUT_DIGITS, perimeter);

Обновление 2: Если я закомментирую последнюю строку с mpf_get_str()ошибка не возникает.

Я также нашел очень старые сообщения об ошибках 2003 года: http://gmplib.org/list-archives/gmp-discuss/2003-November/000888.html

Стек вызовов от отладчика GCC:

#0 63AE80E9 wxThreadInternal::DoThreadOnExit(thread=0x2cfa978) (../../src/msw/thread.cpp:553)
#1 63B27ACF wxScopeGuardImpl1<void (*)(wxThread*) (../../include/wx/scopeguard.h:168)
#2 63B3F95B wxPrivate::OnScopeExit<wxScopeGuardImpl1<void (*)(wxThread*) (../../include/wx/scopeguard.h:67)
#3 63B27B36 wxScopeGuardImpl1<void (*)(wxThread*) (../../include/wx/scopeguard.h:166)
#4 63AE82FB wxThreadInternal::DoThreadStart(thread=0x2cfa978) (../../src/msw/thread.cpp:561)
#5 63AE83F2 wxThreadInternal::WinThreadStart(param=0x2cfa978) (../../src/msw/thread.cpp:602)
#6 75C4906A ui64tow() (C:\Windows\SysWOW64\msvcrt.dll:??)
#7 75C49147 msvcrt!iswalnum() (C:\Windows\SysWOW64\msvcrt.dll:??)
#8 76448543 UnregisterBadMemoryNotification() (C:\Windows\SysWOW64\kernel32.dll:??)
#9 00000000 0x02cfb178 in ??() (??:??)
#10 00000000    0x77e8ac69 in ??() (??:??)
#11 00000000    0x77e8ac3c in ??() (??:??)
#12 00000000    0x00000000 in ??() (??:??)

0

Решение

new не «терпит неудачу», по сути, у вас где-то есть куча коррупции.

0

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

Если в этой строке действительно произойдет сбой (существует также немаловажная вероятность того, что GDB просто потеряется и не отобразит последующие кадры), тогда thread Сам указатель должен быть NULL или недействительным, что не может произойти при обычном выполнении, поэтому я согласен с другим ответом: что-то, кажется, повреждает ваши переменные. Но проверьте, если ваш OnExit() вводится на всякий случай, если GDB лжет.

И поскольку вы используете кроссплатформенные библиотеки, вы должны иметь возможность перестроить под Linux и запустить его под valgrind, что должно выявить все очевидные проблемы.

0

Указатель экспоненты (здесь expptr) должен быть уже инициализирован для объекта.

Этот однострочник решает проблему:

expptr = new mp_exp_t();

// call mpf_get_str()

Я также хочу отметить, что VZ. был прав, что GDB (GNU Debugger) Можно показать неправильную строку исходного кода, в которой должна появиться ошибка.

Поэтому не надо только полагаться на это.

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