Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Прямой вызов деструктора в C++

Автор вопроса: Eduard RostomyanОтветов: 1

Отсюда код ниже.

class A
{
    int x;
public:
    A() {x = 3;}
};


int main()
{
    void* mem = operator new(sizeof(A));
    A* obj = static_cast<A*>(new(mem)(A));
    std::cout << obj->x << std::endl;
    obj->A::~A();
    std::cout << obj->x << std::endl;
}

Мой первый вопрос: почему я могу напрямую вызвать деструктор A; Мой второй вопрос: почему вывод:

3
3

Объект obj не удаляется после вызова деструктора? Вторые 3 меня смущают.

  • поскольку это обычная функция, она автоматически вызывается компилятором при выделении памяти (объект выходит за рамки основной функции). cerkiewny 11.05.2015

c++new-operatordestructorplacement-new

Ответы

Ответ 1 · рейтинг 7 · Baum mit Augen

Почему я могу вызвать деструктор?

Потому что это общедоступная функция-член, и вы можете вызывать общедоступные функции-члены.

Почему объект не удаляется?

В вашем конкретном случае он все еще существует, потому что A имеет тривиальный деструктор.

Если бы он был нетривиальным, он был бы удален в том смысле, что вам больше не разрешено его использовать. Если вы все равно это сделаете, у вас будет неопределенное поведение.

Для более подробного обсуждения этого прочитайте это.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы