Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
383 / 280 / 112
Регистрация: 28.04.2015
Сообщений: 1,726

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

26.12.2020, 08:41. Показов 5690. Ответов 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
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
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
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
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
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
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
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru