На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Проверка объекта на применение к нему NEW. , Qt Creator v.3.5.x.
    Как написать проверку для объекта, который еще не был создан посредством new? Нужно различить, выполнялось ли New для данного объекта или нет.

    Try не помогает. Сравнение с NULL тоже.
      Что значит объекта? Скорее всего там указатель на объект. Очевидно, непроинициализированный. Нужно сначала присвоить ему null, а потом сравнивать.
        Я, честно говоря, не уверен что правильно тебя понял. Но обычно делают так
        ExpandedWrap disabled
          MyClass* object = nullptr; // или NULL если nullptr еще нет
          ...
          if (!object) {
             // еще не создавался
             object = new MyClass;
          }
          Цитата Сергей85 @
          Как написать проверку для объекта, который еще не был создан посредством new?

          В общем случае - никак. Синтаксис С++ не позволяет этого сделать. Даже если мы переопределим глобальные операторы new/delete, мы не сможем передать аллокатору адрес переменной, для которой выделяется память и конструируется экземпляр. Попутно возникает вопрос "а нужно ли?". Переменная - не константа, она может менять свое значение, в том числе и на невалидное. Тогда какой смысл проверки "выделялось/не выделялось?"

          Можно пойти другим путем. Переписать глобальные new/delete таким образом, когда каждое выделение памяти заносится в какой нить контейнер в виде стартового адреса и длины. Естественно, при delete - убирается. Тогда можно ответить на вопрос "переменная содержит валидный адрес-указатель?". Но для продакшен кода я этим бы и не заморачивался - слишком большой будет оверхед. Для отладки же - инструменты есть в достатке. Тот же valgrind.
            Я правильно понял - тебе куда-то передаётся указатель и ты хочешь знать нужно потом вызывать для него delete или нет?
            Возможно, есть какой-то способ определить находится адрес в куче или нет, но стопудово не универсальный.
            Кроме того, не забывай, что иногда нужно вызывать delete[]. Тут ты уж точно ничего не сделаешь.

            Здесь лучше передавать не указатель, а unique_ptr, у которого можно переопределять функцию удаления объекта.
            Для динамических объектов будет передаваться unique_ptr<T, std::default_delete>, для статических - unique_ptr<T, do_nothing> и т.п.
              Да, решением оказалось, как и в случае с обычными переменными - убрать мусор из указателя, присвоив ему NULL. И сравнение пошло успешно. Главное, в будущем не забывать после delete делать null.
                Только делайте это аккуратно, не вводите себе аки аксиому, а то получите хлам наподобие:
                ExpandedWrap disabled
                  {
                    int **a;
                    ...
                    for( int i=0; i<n; i++) a[i] = NULL;
                    delete [] *a;
                    a = NULL;
                    return 0;
                  }
                  Сергей85, std::vector или std::shared(unique)_ptrскорее всего решили бы твои проблемы.
                  Сообщение отредактировано: shm -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0246 ]   [ 17 queries used ]   [ Generated: 28.03.24, 10:57 GMT ]