Russian Qt Forum
Ноябрь 25, 2024, 00:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: setModel  (Прочитано 12803 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #15 : Январь 24, 2014, 15:17 »

через вывод в консоль можно локализовать место, где падает Улыбающийся
Код
C++ (Qt)
qDebug() << 1;
foo * a;
qDebug() << 2;
a->doIt();
qDebug() << 3;
 
консоль:
1
2
Программа неожиданно завершилась бла-бла-бла...
 
Значит, ошибка между 2 и 3 Улыбающийся
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Январь 24, 2014, 15:47 »

ты ведь нам свою функцию main не показал. если ты там создаешь mainwindow на стеке, то при закрытии главного окна программа пытается удалить память второй раз (атрибут удаления в mainwindow). удали этот атрибут и ошибка пропадет.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Hrundel
Гость
« Ответ #17 : Январь 24, 2014, 19:04 »

Слушай, kambala, вопрос к теме, но немного в сторону.
*(Кстати спасибо за объяснение "умных указателей" - стало чуть понятней)
Был у нас такой предмет на втором семестре - Теоретическая информатика, из которой очень хорошо можно было понять как резервируется физическая память, как ALU работает с регистрами и прочее. Но !!! Вот на программировании, что I что II никто не удосужился объяснить какие процессы происходят в памяти программ с точки зрения высоких языков (С/СPP). Подскажи литературу к этому вопросу. Спасибо!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #18 : Январь 24, 2014, 19:44 »

не совсем понял вопрос. какой код напишешь — то и будет происходить. высокоуровневый код же преобразовывается в низкоуровневый (инструкции процессора). тебя интересует как команды С/С++ превращаются в ассемблерный код?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Hrundel
Гость
« Ответ #19 : Январь 24, 2014, 19:54 »

Почти. Просто, так же как и у автора поста порой возникают серьезные проблемы с пониманием того, как обращаться с памятью.
Например: создаю я указатель на диалоговое окно, которое посылает сигнал. После того как сигнал обработан я удаляю его оператором delete. Всегда спрашиваю себя, что там происходит в памяти? Как быть уверенным, что память полностью очистилась. А close() идентичен опературу delete или нет?

Или как в случае приведенном выше

если создаешь mainwindow на стеке, то при закрытии главного окна программа пытается удалить память второй раз (атрибут удаления в mainwindow). удали этот атрибут и ошибка пропадет.

Надеюсь сумел донести смысл того, что мне не понятно.
« Последнее редактирование: Январь 24, 2014, 19:56 от Hrundel » Записан
Hrundel
Гость
« Ответ #20 : Январь 24, 2014, 19:57 »

Хочется иметь в голове стройное представление как и что там в памяти происходит. Особенно  с указателями.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #21 : Январь 24, 2014, 21:08 »

После того как сигнал обработан я удаляю его оператором delete. Всегда спрашиваю себя, что там происходит в памяти? Как быть уверенным, что память полностью очистилась.
о таких тонкостях как-то никогда не задумывался Улыбающийся как я это понимаю: область «кучи», на которую указывает указатель, помечается удаленной и становится невалидной. далее ОС уже решает что делать с этим куском памяти (изъять ее у программы или нет). может кто-то поправит/дополнит мой ответ.

очистилась эта память или нет ты не узнаешь, но вот то, что вероятнее всего программа упадет при обращении в эту область памяти (например попытка вызвать метод у удаленного указателя) — это да.

стек же — это фиксированная область памяти (уже выделенная), в которой переменные просто занимают место (не нужно у ОС явно запрашивать память как в случае с кучей). попал на стек — ты уже с памятью, вылетел со стека — и ты «без памяти» (удаление происходит автоматически), т.е. переменная находится в невалидной области памяти. послеэ этого обратиться к переменной не даст компилятор (она будет вне области видимости), но при попытке удалить такую переменную delete'ом, она будет еще раз удалена при вылете со стека, что и приведет к падению программы.
А close() идентичен опературу delete или нет?
нет конечно. но если ты окну поставишь атрибут WA_DeleteOnClose, то оно заодно и удалится.
Цитировать
bool QWidget::close() [slot]
Closes this widget. Returns true if the widget was closed; otherwise returns false.

First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.

If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Hrundel
Гость
« Ответ #22 : Январь 24, 2014, 22:03 »

Вот, спасибо, теперь понятно стало. А то я все путал. Для меня и steck и куча были одним и тем же! Прояснилось!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #23 : Январь 24, 2014, 23:07 »

stack Подмигивающий
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Figaro
Гость
« Ответ #24 : Январь 25, 2014, 07:25 »

ТС да прочитайте про ассемблер книги под Вашу конкретную платформу... практически любой сишный или плюсовый компилятор умеет выдавать листинг ассемблера
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #25 : Январь 27, 2014, 09:24 »

Спасибо ,kambala, за разъяснения Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 23.