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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Обнуление указателя  (Прочитано 13246 раз)
blood_shadow
Гость
« : Октябрь 26, 2010, 00:51 »

Доброго времени суток!
Возник вопрос, не могу дойти до истины. Вызывается ф-ция addNewRecord() она создает объект Day который является диалоговым окном(имеет 3 кнопки ">>" "Ok" "Cancel") результат нажатия пользователя возращается как
Код:
 i = Day->exec(); 

в самом последнем еlse вызывается обработка нажатия "Cancel", так вот вопрос почему строка
Код:
Day = 0;
следующая после удаления объекта вызывает крах программы?

Код:
void Analysis_of_accidents::addNewRecord()
{
    Day = new Day_and_person(SizeForDialogs);
    // Construct structs for Data
    DataRepository = new QStringList;

    int i;
    i = Day->exec();

    if (i) {
        if (i==1) //Ok
        {
            *DataRepository << Day->returnDay_and_personList();

            while (DataRepository->size() < (ColumnCount - 1)) *DataRepository << *emptyString;

            delete Day;
            Day = 0;

            emit StringListIsReady();
        }
        else // >>
        {
            *DataRepository << Day->returnDay_and_personList();

            addNewRecordEmployee();
        }
    }
    else { // Cancel
        delete DataRepository;
        delete Day;
        Day = 0;
        return;
    }

    return;

}
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #1 : Октябрь 26, 2010, 02:00 »

а зачем вы пытаетесь присовить нулевое значение уже удаленному указателю?
Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Октябрь 26, 2010, 06:56 »

Код ужасный. Обнуление указателя крах вызвать не может, ошибка в другом.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Октябрь 26, 2010, 10:07 »

>>а зачем вы пытаетесь присовить нулевое значение уже удаленному указателю?
Указатель НЕ удалён. Удалён объект, на который указывал указатель. А обнуление указателя - хорошая практика.
Записан

Юра.
blood_shadow
Гость
« Ответ #4 : Октябрь 26, 2010, 15:47 »

Код ужасный. Обнуление указателя крах вызвать не может, ошибка в другом.
а можно тогда поинтересоваться в чем состоит ужастность кода?
я поэкспериментировал, если закомментировать обнуление указателя, то ошибки не будет, в чем может быть дело?
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #5 : Октябрь 26, 2010, 16:02 »

Цитировать
а можно тогда поинтересоваться в чем состоит ужастность кода?
Ну вот хотя бы в этом, имхо

Код
C++ (Qt)
if (i) {
       if (i==1) //Ok

Может лучше было бы:

Код
C++ (Qt)
if ( i == QDialog::Accepted )
{
//  if select ОК
}
else
{
// if select Cancel
}
Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Октябрь 26, 2010, 16:13 »

+1
А еще всякие *DataRepository << *emptyString; не очень красиво.

А дело где-то дальше по коду.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #7 : Октябрь 26, 2010, 16:30 »

Цитировать
а можно тогда поинтересоваться в чем состоит ужастность кода?
Ну вот хотя бы в этом, имхо
ну вот отредаченая версия:
Код:
        if (i==QDialog::Accepted)
        {
            *DataRepository << Conditions->returnConditionsList();

            while (DataRepository->size() < (ColumnCount - 1)) *DataRepository << *emptyString;

            delete Conditions;
            Conditions = 0;
            delete Day;
            delete Employer;

            emit StringListIsReady();
        }
        else if (i == Day_and_person::Next)
        {
            *DataRepository << Conditions->returnConditionsList();

            addNewRecordPeoples();
        }
        else {
            delete DataRepository;
            delete Conditions;
            Conditions = 0;
            delete Day;
            delete Employer;
            return;
        }

У меня три кнопки поэтому я определил перечисление Day_and_person::Next, которое равно 3, вопрос можно как-то в базовом классе QDialog определить перечисление типа QDialog::Next?
Записан
DOOMer
Чайник
*
Offline Offline

Сообщений: 95



Просмотр профиля
« Ответ #8 : Октябрь 26, 2010, 16:33 »

Код
C++ (Qt)
   else {
       delete DataRepository;
       delete Conditions;
       Conditions = 0;
       delete Day;
       delete Employer;
       return;
   }
А этот elsre откуда? Покажите уж полный код этой вашей падающей  функции.

IPD  а все, увидел.
« Последнее редактирование: Октябрь 26, 2010, 16:36 от DOOMer » Записан

Linux x86_64 && Qt 5.4.0 && Qt 4.8.6t && GCC 4.9.2
blood_shadow
Гость
« Ответ #9 : Октябрь 26, 2010, 16:35 »

+1
А еще всякие *DataRepository << *emptyString; не очень красиво.

А дело где-то дальше по коду.

согласен указатели выглядят в этих выражениях не красиво, а как тогда поступить если мне нужно передать этот DataRepository типа QStringList дальше по программе? или лучше передавать в качестве параметра ф-ций?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Октябрь 26, 2010, 16:36 »

Программа большая? Просто по кусочкам ничего толком не понятно, кроме того, что с программированием у тебя не очень. (Извини, но это так). Если есть желание, пришли мне код на мыло, а я по свободе поковыряю его в поисках ошибки, да и постараюсь поправить код до нормального состояния.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #11 : Октябрь 26, 2010, 16:44 »


А этот elsre откуда? Покажите уж полный код этой вашей падающей  функции.

IPD  а все, увидел.

вот полная ф-ция
Код:
void Analysis_of_accidents::addNewRecord()
{
    Day = new Day_and_person(SizeForDialogs);
    // Construct structs for Data
    DataRepository = new QStringList;

    int i;
    i = Day->exec();

    if (i==QDialog::Accepted) //Ok
        {
            *DataRepository << Day->returnDay_and_personList();

            while (DataRepository->size() < (ColumnCount - 1)) *DataRepository << *emptyString;

            delete Day;
            Day = 0;

            emit StringListIsReady();
        }
    else if (i==Day_and_person::Next) // >>
        {
            *DataRepository << Day->returnDay_and_personList();

            addNewRecordEmployee();
        }
    else { // Cancel
        delete DataRepository;
        //delete Day;
        //Day = 0;
        return;
    }

    return;

}
Короче было выяснено что падает из-за
Код:
delete Day;
впечатление будто окно раньше удаляется чем заканчивается обработчик событий
Записан
blood_shadow
Гость
« Ответ #12 : Октябрь 26, 2010, 16:48 »

Программа большая? Просто по кусочкам ничего толком не понятно, кроме того, что с программированием у тебя не очень. (Извини, но это так). Если есть желание, пришли мне код на мыло, а я по свободе поковыряю его в поисках ошибки, да и постараюсь поправить код до нормального состояния.
та вот же и пытаюсь научиться  В замешательстве
ок, вышлю на мыло
еще вопрос остался что надо делать чтобы научиться нормально программить? я имею ввиду больше практики или больше чтения или и того и другого?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Октябрь 26, 2010, 16:49 »

И то, и другое. Плюс к этому читать чужие исходники.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #14 : Октябрь 26, 2010, 16:54 »

И то, и другое. Плюс к этому читать чужие исходники.
пасиба, особенно за чужие исходники - это то что я обычно избегал делать
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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