383 / 280 / 112
Регистрация: 28.04.2015
Сообщений: 1,726

Повторный вызов деструктора

26.12.2020, 08:41. Показов 5550. Ответов 67

Студворк — интернет-сервис помощи студентам
Привет!
Есть класс TVector и есть у него деструктор вот такой:
C++ (Qt)
1
2
3
4
5
6
7
    ~TVector(void)
        {
            delete[] this->data;    // уничтожаем данные
            this->data = NULL;      // не оставляем висячих указателей
     
            this->n = 0;            // данных нет, поэтому кол-во элементов стало равно 0
        }
тут вроде все легко и все работает, но в условии задачи есть такое требование:
"надо корректно обрабатывать ситуацию повторного вызова деструктора. В этом случае деструктор не должен пытаться освобождать в динамической памяти объекты повторно"

я не оч.выкупил, что требуется, но решил добавить такую проверку в деструкторе:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    ~TVector(void)
        {
            if(this->n != 0)
            {
                delete[] this->data;    // уничтожаем данные
                this->data = NULL;      // не оставляем висячих указателей
     
                this->n = 0;            // данных нет, поэтому кол-во элементов стало равно 0
            }
        }
Вопрос: это нужно было сделать с деструктором или нет?) Если нет, то, что??
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.12.2020, 08:41
Ответы с готовыми решениями:

Повторный вызов деструктора
{ bar b; b.~bar(); } В данном примере деструктор bar вызовется дважды. Как у уже удаленного объекта может вызываться...

Исключительные ситуации (повторный вызов деструктора)
Всем привет ! Подскажите пожалуйста , почему повторно вызываются деструкторы класса A,B,C? #include <stdio.h> #include...

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

67
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
26.12.2020, 21:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
The type of the this pointer for a member function of a class type X, is X* const. If the member function is declared with the const qualifier, the type of the this pointer for that member function for class X, is const X* const.
С формальной точки зрения это неверно. Однако так удобнее объяснять вещи людям, которые не имеют подготовки уровня language lawyer.

Если вдруг вам будет интересно разобраться в сути, а не ограничиваться собственными рассуждениями, то попробуйте начать вот с такого примера:
C++
1
2
3
4
5
6
int * foo(); // реализация есть, она произвольно корректная
 
int main() 
{
     foo() = 0;
}
Вопросы для размышления:
1) тип возвращаемого значения int * const?
2) почему мы не можем присвоить ноль?

Добавлено через 1 минуту
PS. Мне о результатах положительных или отрицательных рассказывать не обязательно. Точнее даже не нужно. Я просто указал вам дорогу, дальше уже сами.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.12.2020, 22:30
Цитата Сообщение от DrOffset Посмотреть сообщение
Однако так удобнее объяснять вещи людям, которые не имеют подготовки уровня language lawyer.
IBM тратит время зря. Скажите DrOffset, почему так пусто вразделе С++ профи, а в новичковском разделе фраза из 3-х слов вызывает такой офтоп? Что лучше, высказаться по теме или постараться бросить уязвляющее замечание?
Цитата Сообщение от DrOffset Посмотреть сообщение
Вопросы для размышления:
1) тип возвращаемого значения int * const?
2) почему мы не можем присвоить ноль?
Я не говорил что правосторонние значения можно изменять. И я не говорил что невозможно изменить константу. Это так же отогонально к моей фразе от константности this как и то что категории значений и типы - ортогональные понятия. Тут уж и cppreference которые почти не отходят от стандарта говорят открытым текстом... Я уж не говорю о том что комитет и сообщество по ресурсам (включая не только деньги но профессионалов) несравнимы с IBM. Дело не только в и не столько в авторитетах. Дело даже не в том, что сделали с языком категории значений. Дело даже не в том кто прав (с точки зрения того как захотел увидеть другой участник). Дело даже не в стиле обсуждения (хотя в этом тоже). Если моё эссе вам непонятно, я вряд ли смогу как-то помочь. Я лишь попытался и всё.
0
26.12.2020, 22:57

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Что лучше, высказаться по теме или постараться бросить уязвляющее замечание?
Никаких уязвляющих замечаний я не бросал :)
Я ума не приложу что вы такого увидели в сообщении выше. Вопросы, которые вы процитировали, должны помочь понять почему цитата с сайта IBM не совсем верна. И все.

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2020, 00:28
Цитата Сообщение от DrOffset Посмотреть сообщение
Никаких уязвляющих замечаний я не бросал
А я не о вас говорил в контексте уточняющих замечаний. Замечание было на
Цитата Сообщение от IGPIGP Посмотреть сообщение
Деструктор работает с this а он не может быть сброшен. Он константа)
в виде
Цитата Сообщение от 0x10 Посмотреть сообщение
Он не константа, а prvalue.
и с этого тема ушла в сторону. Хотя this имеет и тип и категорию значения. Вы просто продолжили и явно указали, что раздел новичков С++ данного форума, это ни какая-то там IBM (в контексте вопроса повторного вызова деструктора, разумеется).
И пытаетесь научить меня (makе me understand)
Цитата Сообщение от DrOffset Посмотреть сообщение
Вопросы, которые вы процитировали, должны помочь понять почему цитата с сайта IBM не совсем верна. И все.
Я хотел бы быть по-чаше не так верен как тексты подобных источников. И всё?
Нет конечно. Смотрите. Вопрос данной темы концептуально не нов и сводится, фактически к вопросу ручного запуска деструктора. Но не только. Были затронуты вопросы реализации совместного владения. И не раскрыто. Даже мелочь о том, что если уж занулил указатель то проверять его перед delete не требуется, не прозвучала. Этот вызов безопасен на нулевом указателе. То есть, по большому счёту, кроме некоторой малой потери быстродействия такое сброс указателя ни чего не несёт и является невинным актом праведной монахини в отношении свечи. Ни какого профита в части повторного вызова деструктора тут конечно нет. В целом это было отмечено.
И вы видите как замечание по this сработало в теме? Досталось даже IBM (хотя я легко могу найти и другие источники, то что this имеет тип указателя константы это медицинский факт, хотя он может быть реализован и как неизменяемое правостороннее выражение возвращаемое как временная корпия, да. Но может быть и иначе).
-
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
27.12.2020, 00:32
Цитата Сообщение от IGPIGP Посмотреть сообщение
хотя я легко могу найти и другие источники, то что this имеет тип указателя константы это медицинский факт
Единственный источник, который в этом вопросе имеет вес - это стандарт С++. А там не так. Получается - это не факт, а миф, весьма распространенный, что даже в IBM не уследили.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2020, 00:40
Цитата Сообщение от DrOffset Посмотреть сообщение
даже в IBM не уследили.
Дык куда им. Они же там со своими спутниками, ракетами и пр. совсем от математики (реальной крутизны) отбились. Вот мелко-мягкие (математики вроде, но не настолько чтобы не быть прикладными). То есть, самое то https://docs.microsoft.com/ru-... w=msvc-160
Цитата Сообщение от не уследивших, тоже
Тип this в функции-члене описан в следующем синтаксисе. Список «ОПС-квалификатор» определяется на основе декларатора функции-члена. Это может быть const или volatile (или). * class -Type* — это имя class :

[ОПС-квалификатор-List] * class -тип* ** * const this **

Иными словами, this указатель всегда является const указателем. Его нельзя назначить. const volatile Квалификаторы или, используемые в объявлении функции члена, применяются к class экземпляру, на this который указывает указатель в области этой функции.
Сколько ещё нужно?
И речь опять не о том. Тема завалилась из-за ненужного замечания в категоричной форме. Неверного к тому же или по крайней мере спорного.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
27.12.2020, 01:07
Цитата Сообщение от IGPIGP Посмотреть сообщение
раздел новичков С++ данного форума, это ни какая-то там IBM (в контексте вопроса повторного вызова деструктора, разумеется).
Какая разница где написана правда? Правду можно и на заборе написать, она от этого правдой быть не перестанет.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Сколько ещё нужно?
Официальный источник по С++ - это стандарт C++. Считаете, что я ошибаюсь и зря сказал, что цитата с сайта IBM не совсем верна? Тогда откройте стандарт и найдите там опровержение.

Что касается Microsoft, то это документация по их компилятору, а не по С++. Они описывают диалект С++, реализованный в их компиляторе. И у них this действительно const. Однако здесь мы не обсуждаем конкретную реализацию, по крайней мере об этом нигде не было указано явно. По диалекту MS у нас есть отдельный подраздел здесь: https://www.cyberforum.ru/visual-cpp/

Добавлено через 5 минут

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Тема завалилась из-за ненужного замечания в категоричной форме.
То, что замечание было ненужное - лично я согласен. На суть темы оно не влияет.
Однако что сделано, то сделано. Вы и сами приложили руку к тому, что тема скатилась, начав спорить.



Добавлено через 6 минут
Обсуждение нашего подвопроса на SO.
Верный ответ со ссылками на стандарт и пояснением исторических причин отступления от стандарта в некоторых реализациях C++:
https://stackoverflow.com/ques... 67#6067267
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2020, 01:40
Да, вот текст черновика:
9.3.2 The this pointer [class.this]
1 In the body of a non-static (9.3) member function, the keyword this is a non-lvalue expression whose value is the address of the object for which the function is called. The type of this in a member function of a class X is X*.
non-levalue - это настолько осторожно, будто змею за голову вытаскивают.
Где-нибудь было бы интересно увидеть, в чём смысл и профит от
C++
1
2
3
4
struct S
{
  void foo() { S *&&r = this; }
};
больше ни кто не нашёл вразумительных причин по которым его следует считать не константой (в то время как ряд компиляторов продолжают нечестивую крамолу). Так или иначе, я не уверен, что где-то не спутаю в речи. Не люблю заклинаний, а неосмысленные но строгие заявления для меня - заклинания. Я не считаю, что подобные вещи являются ошибкой достойной упоминания так как не вижу чем это может навредить, а исправление помочь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.12.2020, 01:40

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в функции Foo() ,объект уничтожается когда мы...

Вызов деструктора
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Вызов деструктора
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора
При ручном вызове деструктора, освобождается ли память*


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
68
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru