На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Повторный вызов деструктора , С++, визуал студия какой-то версии (вроде 2010)
    Всем хай! Сходу к делу без всякой разминки.
    Есть класс TVector и есть у него деструктор вот такой:
    ExpandedWrap disabled
          ~TVector(void)
          {
              delete[] this->data;    // уничтожаем данные
              this->data = NULL;      // не оставляем висячих указателей
              
              this->n = 0;            // данных нет, поэтому кол-во элементов стало равно 0
          }


    тут вроде все легко и все работает, но в условии задачи есть такое требование:
    "надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно"

    я не оч.выкупил, что требуется, но решил добавить такую проверку в деструкторе:
    ExpandedWrap disabled
      ~TVector(void)
          {
              if(this->n != 0)
              {
                  delete[] this->data;    // уничтожаем данные
                  this->data = NULL;      // не оставляем висячих указателей
              
                  this->n = 0;            // данных нет, поэтому кол-во элементов стало равно 0
              }
          }


    Вопрос: это нужно было сделать с деструктором или нет?) Если нет, то, что??
      Не нужно ничего делать. delete[] data и так внутри проверит на nullptr, поэтому ничего не упадёт у тебя. Тут надо решать другую проблему - как у тебя вообще получилось так, что деструктор вызывается дважды? Если ты дважды вызвал delete на одном и том же указателе, то тебе не поможет ничего, т.к. это UB. А если ты его вызываешь зачем-то руками, то см первую часть ответа.
        Цитата OpenGL @
        Тут надо решать другую проблему - как у тебя вообще получилось так, что деструктор вызывается дважды?

        я нигде не писал, что деструктор у меня вызывается дважды

        хинт: читать внимательно условие в 1ом посте, там все написано

        Добавлено
        дополню еще: у каждого экземпляра класса TVector для поля data выделяется свой участок динам.памяти, т е нет разделяемой памяти между данными векторов

        не понимаю, по-моему 1ая версия деструктора вполне сойдет, там даже есть избыточность по обнулению, но это ладно...
          Цитата FasterHarder @
          я нигде не писал, что деструктор у меня вызывается дважды

          хинт: читать внимательно условие в 1ом посте, там все написано

          Там написано "надо корректно обрабатывать ситуацию повторного вызова деструктора.". Если повторного вызова не будет, то ситуация считается очевидным образом обработанной на уровне выше. А если будет, то см. первое сообщение - поскольку ты плаваешь в азах, то ответить надо в первую очередь на те вопросы.

          Цитата FasterHarder @
          не понимаю, по-моему 1ая версия деструктора вполне сойдет, там даже есть избыточность по обнулению, но это ладно...

          Что значит "даже"? Это единственное, что там есть, и это мелочь. Возможно, даже тупо if дольше будет выполняться, чем эти обнуления - мало ли, как предсказатель ветвлений сработает. А падения или прочей фигни всё равно не будет.
            Цитата OpenGL @
            даже тупо if дольше будет выполняться, чем эти обнуления

            1ая версия деструктора не содержит if!!
            хинт: читать и перечитывать внимательно посты выше, хотя, думаю, не стоит
            вопрос зыкрыт.

            зы: плавать ты меня точно не научишь, даже не пытайся
              Цитата FasterHarder @
              зы: плавать ты меня точно не научишь, даже не пытайся

              Да, научить не смогу, тут не во мне проблема :no-sad:
                Цитата FasterHarder @
                надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно

                Сама по себе ситуация повторного вызова деструктора на одном и том же объекте - уже является ошибкой. Это значит, что например ты сделал 2 раза delete одному и тому же объекту. Как можно корректно обрабатывать эту ситуацию в деструкторе то? :D Раз ты второй раз попал в деструктор одного и того же объекта - это уже ошибка, и ошибка на уровне выше, а не в деструкторе.
                  Постановщик задачи уже наступал на грабли вызова деструктора дважды.
                  Опыт отсюда не вынес...
                  По этому, поставил такое условие.

                  Имхо... Выполнить условия не сложно... Но с таких подходом, в коде может быть очень много "багов", которые надо вот таким образом подстраховывать... Но все косяки не предугадаешь...
                    Цитата FasterHarder @
                    тут вроде все легко и все работает, но в условии задачи есть такое требование:
                    "надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно"
                    При таких входных данных за задачу лучше вообще не браться. По ходу, автор задачи просто не в теме. Вообще. Неизвестно, что ему ещё в голову взбредёт.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0306 ]   [ 16 queries used ]   [ Generated: 19.04.24, 00:54 GMT ]