@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. Это нормальное поведение? Деструктор же вызвали, объект должен был уйти в утиль,не? или в утиль уходят только внутренние объекты?
  • Вопрос задан
  • 2952 просмотра
Решения вопроса 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;

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

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

Войти через центр авторизации
Похожие вопросы