Как понять вызов метода деструктора в CPP?

Я пытаюсь понять метод Destructor в CPP.
Я знал факты:
а. Метод Destructor будет автоматически вызываться при завершении экземпляра.
б. Если явных методов деструктора не определено, то компилятор создаст деструктор по умолчанию (хотя не будет выполнено ни одной конкретной задачи, такой как очистка динамической памяти пользователя).

Итак, предположим, что A — это имя класса, я хотел бы знать, сколько раз будет вызываться деструктор класса A:

Теперь я понимаю, что самую последнюю строку «delete [] p» нельзя рассматривать как деструктор, она просто используется для удаления динамического указателя p.
Поскольку в классе А нет информации, создан ли явно деструктор, мы думаем, что деструктор класса по умолчанию создан, поэтому дважды вызывается для p (потому что в A [2] есть два элемента), и один раз для p2, всего три раза.

Я не уверен, правильно ли это выше или нет. Надеюсь, что гуру CPP может помочь мне. Спасибо!!

int main(){
A *p = new A[2];
A * p2 = new A;
A a;
delete []p;
}

-1

Решение

Деструктор будет вызываться ровно один раз для каждого экземпляра класса. Я исключаю предельный случай завершения программы, заставляющий весь процесс уйти, не вызывая деструкторы выдающихся объектов (нет никакого смысла в этом).

В вашем примере p указатель на массив, содержащий два экземпляра класса delete[] p собирается уничтожить два экземпляра класса. Деструктор класса вызывается один раз для каждого разрушаемого объекта, всего два раза. p2 является указателем на один экземпляр класса, но так как он не является явно deleteг, тот попадает в крайний случай. Наконец, есть экземпляр класса в функции автоматической области видимости. Этот экземпляр уничтожается, когда выполнение покидает область действия функции, так что это еще один вызов деструктора.

Независимо от того, имеет ли класс деструктор по умолчанию или явно объявленный деструктор, это не имеет значения. Какой бы деструктор не был у этого класса, этот деструктор вызывается.

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector