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

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

26.12.2020, 08:41. Показов 5494. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru