Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ realloc при release сборке

Автор: KuvshinoF 23.3.2021, 13:31

при release сборке (CONFIG+=release в pro-файле) программа сразу при запуске падает с realloc(): invalid pointer: 0x0000...debug-сборка данной программы работает отлично. В чем тут дело и как исправить? (причем в этом проекте нельзя вручную изменить конфигурацию сборки на выпуск (только отладка), вновь созданный чистый проект работает в release нормально и есть ручной выбор конфигурации сборки)

Автор: Iron Bug 23.3.2021, 17:30

обнули указатель перед использованием. некоторые компиляторы их не обнуляют. собственно, по стандарту они и не обязаны.

Автор: KuvshinoF 23.3.2021, 21:36

Понятно...да, может какой-то указатель и не обнулен. А почему в debug-версии это проходит (все работает норм)?

Автор: Iron Bug 24.3.2021, 6:46

скорее всего, в дебаге память может обнуляться для проверок. но в дебаге ещё и распределение адресов другое. может, просто повезло с мусором в памяти и он там нулевой :)

Автор: Алексей1153 24.3.2021, 6:53

Цитата(KuvshinoF @ 23.3.2021, 15:31) *
debug-сборка данной программы работает отлично

- я бы сказал, что работает случайно ))

натрави на проект статический анализатор, он много интересного найти может

Автор: KuvshinoF 25.3.2021, 8:25

Да, но новый, "чистый" проект с указателем QWidget * mywidget; в качестве члена QMainwindow и без обнуления отлично работает в release-сборке.

Автор: Iron Bug 25.3.2021, 14:45

смотря как ты используешь этот указатель.

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

Автор: KuvshinoF 25.3.2021, 15:12

Понятно. То есть дело точно в начальном необнулении укателя(ей)?

Автор: Алексей1153 25.3.2021, 18:24

KuvshinoF, инициализация должна быть, иначе будут сюрпризы. Но дело может быть не только в этом.
Мы же не знаем, что ты там делаешь с указателями

Автор: KuvshinoF 1.4.2021, 10:09

Вроде все указатели в конструкторах занулил, но эффекта это не возымело. А можно как-то локализовать эту ошибку (узнать место программы, из-за которого возникает этот realloc: invalid pointer)?

Автор: Iron Bug 1.4.2021, 22:12

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

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

если в дебажной версии не падает, я могу предложить только сборку релиза, но без стрипа имён, и как вариант - использовать Google Breakpad. он кроссплатформенный и собирает дампы при падении программ.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)