WedX - журнал о программировании и компьютерных науках

C ++ Удаление указателя на объект, содержащий другой указатель

Скажем

class A {
  A* array;
public:
   A (){ 
    array= new A [4];
  }

  ~A (){
    delete array;
  }
}

Как мы освободим объект, если мы создадим такой объект в куче, например

A* object_ptr =new A();

Я немного смущен освобождением указателя, который указывает на объект, содержащий другой указатель ...


Ответы:


1

Следует отметить два момента.

  1. При удалении массивов следует использовать []. Например: delete [] array;
  2. При удалении указателей будет вызван деструктор выделенного объекта. Вы должны вызвать из своего кода: delete object_ptr;, чтобы удалить указатель.

Еще один важный момент, о котором следует помнить, - это то, что происходит, когда вы копируете свой объект. Если ваш объект когда-либо получит копии, у вас будут проблемы, когда один деструктор удаляет указатели из-под другого объекта. Вот почему shared_ptr является хорошей альтернативой необработанным указателям (см. this вопрос о том, как пользоваться shared_ptr).

25.05.2015
  • Если я назначу object_ptr новому указателю, вызовет ли это ту же проблему? 25.05.2015
  • да. Если вы напишете: A *a = new A(); A *b = a; delete a;, тогда будет удалена и внутренняя array b. 25.05.2015
  • Хм .. также, если объект создается методом в стеке с одним из его полей, созданным в куче, освобождается ли память в куче после этого? 26.05.2015
  • Да, деструктор объекта в стеке будет вызываться, когда объект выйдет за пределы области видимости. 26.05.2015
  • У меня есть программа, которая возвращаетA object , и по какой-то причине после метода, когда объект возвращается к другой переменной A new_object, я все еще могу без проблем получить доступ ко всем полям. И я смущен, поскольку к тому времени они должны исчезнуть, поскольку они созданы в пакете ... если только оператор присваивания не отличается, когда я использую A new_object = some_method() 26.05.2015
  • Это из-за RVO (см. en.wikipedia.org/wiki/Copy_elision#Return_value_optimization ) 09.08.2018

  • 2

    Звонок

    delete object_ptr;
    

    после

    A* object_ptr =new A();
    

    вызовет деструктор A, на который указывает object_ptr. Это означает, что если вы исправите ошибку

    ~A (){
      delete array;
    }
    

    to

    ~A (){
      delete[] array;
    }
    

    ваш код будет в порядке, и внутренний указатель освободится правильно.

    Однако вам действительно следует использовать std::vector вместо new[]. Это сделает вашу жизнь намного проще. Если вы настаиваете на new[], прочитайте о Правиле трех.

    25.05.2015
  • и std::unique_ptr (если есть) вместо "чистых" указателей 25.05.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]