Задать вопрос
@yanchumak

При вызове delete несколько раз,вызывается деструктор столько же раз,че за?

Объясните данное поведение, ниже простой код(был под рукой QT на нем и писал):

#include <QCoreApplication>
#include <QDebug>

class Item
{
public:
    Item()
    {
        qDebug() << "Item()" << endl;
    }
    ~Item()
    {
        qDebug() << "~Item()" << endl;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Item *item = new Item;
    delete item;
    delete item;
    delete item;

    return a.exec();
}


Деструктор будет вызван 3 раза, и так с любым кол-вом delete. Это нормальное поведение? Деструктор же вызвали, объект должен был уйти в утиль,не? или в утиль уходят только внутренние объекты?
  • Вопрос задан
  • 2971 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Это C++, детка, здесь могут и ногу отстрелить.

Да, это совершенно нормальное поведение для C++. В угоду переносимости и производительности, здесь никто не проверяет, что объект был ранее уничтожен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Невиртуальные методы представляют собой обычные функции, которые получают неявный праметр this на экземпляр класса. Получается что даже код.
A *a = NULL;
a->f();

скомпилируется, но будет работать неправильно.
При вызове нестатических методов (включая деструктор) и обращении к нестатическим полям вы должны гарантировать:
1. вызвался конструктор, объект существует
2. не вызывался деструктор, объект еще не удален
Ответ написан
valent_in_habrahabr
@valent_in_habrahabr
У меня вопрос(опытные люди, ответе мне, у кого стаж более 3-5 лет на с++) это выражение
"здесь могут и ногу отстрелить."
. применяют те кто изучали С++ по youtube? Дело в том, что я изучал С++ по классическим учебникам и всегда следовал правилам придуманные не для того, что бы их нарушали. И я не могу понять как в С++ себе можно ногу отстрелить, если строго следовать правилам? Или это всего навсего выражение новичков/быдлокодеров которые погорели из-за невнимательности на таких вещах как работа с памятью(как пример)? Я может не знаю, что то? Подскажите.

Есть правила, есть стандарты которые придумали умные люди что бы им придерживались а не нарушали!
Item *item = new Item;
delete item;
delete item;
delete item;

Вы заняли память потом её освободили, на этом всё. Как вы освободите повторно уже пустой раздел памяти(который освободили уже)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы