Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/76: Рейтинг темы: голосов - 76, средняя оценка - 4.72
Заблокирован

Можно ли удалить объект экземпляра класса из самого себя?

18.11.2014, 15:10. Показов 17502. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
Допустим:
C++
1
2
3
4
5
6
7
8
9
10
class TEST
{
public:
    TEST();
    ~TEST();
    void DelMe()
    {
        //DEL ME :-)
    }
};
Вот в теле функции DelMe можно как то удалить собственный экземпляр класса? То есть удалить самого себя из себя?

Добавлено через 4 минуты
Вот так вроде работает, но как - то это ..... Так память нормально освобождается?
C++
1
2
3
4
  void DelMe()
    {
        delete this;
    }
деструктор вроде вызывается

Добавлено через 4 минуты
Нашёл себе методичку: http://www.parashift.com/c++-f... -this.html
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2014, 15:10
Ответы с готовыми решениями:

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или как то обойти эту проблему?

Удаление экземпляра класса в функции самого класса (Ошибка при отладке)
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...

67
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.11.2014, 16:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
Все что вам нужно - это понять логику компилятора: на каком основании он имеет право оптимизировать проверку if ( !this
Логику компилятора я понимаю, а вот твою - нет. Причем тут сравнение this с нулем? По поводу сравнения this с нулем вопросов вообще нет, я уже об этом писал. Вместо объяснения элементарных вещей, лучше бы привел все-таки ссылку на стандарт, раз ты так уверен в своих словах.

Цитата Сообщение от hoggy Посмотреть сообщение
Оптимизирующий компилятор закладывается на то, что this всегда валидный (иначе - это UB).
А значит делать проверку не обязательно.
И выпиливает её.
this не становится равным нулю после выполнения delete, delete вообще не меняет значение указателя, который ему передали, delete работает с копией (даже если забыть, что this - константен). Не нужно приводить в пример сравнение this с нулем, это не относится к обсуждаемому вопросу. Лучше приведи в пример цитату из стандарта, из которой следует, что конструкция delete this - UB. То, что эта конструкция в определенных случаях может привести к UB - это понятно и без того. В С++ вообще много какие конструкции при неправильном использовании могут привести к UB, так уж устроен язык. Но мы, опять же, не об этом. Использование delete для стековых объектов, использование объекта после вызова delete - это все те же самые варианты UB, которые существуют независимо от того используем ли мы delete this или нет. Нужен неоспоримый факт, подтверждающий твои слова о том, что delete this - это всегда UB, независимо от контекста применения. Именно с этим (выделенным) все тут несогласны, именно этот тезис нуждается в подтверждении.

Давай я последний раз спрошу, если ты уверен в своих словах, смысловой эквивалент этой фразы из спецификации языка привести сможешь? Ты его приводишь, мы все дружно переосмысливаем свое мировосприятие и расходимся. Иначе толку в этом разговоре - нет.
1
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.11.2014, 19:13
И чем метод release лучше деструктора?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
23.11.2014, 21:17
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем метод release лучше деструктора?
Почитайте внимательнее. Виртуальный деструктор делает код зависимым от используемого транслятора.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.11.2014, 04:28
А release не делает? Чем таким загадочным именно деструктор хуже метода?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
24.11.2014, 04:30
Цитата Сообщение от taras atavin Посмотреть сообщение
А release не делает?
Вы точно читали? Там написано что и как с виртуальными функциями происходит.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.11.2014, 04:33
Там написано, что всё упирается в соглашение, а не в технические запреты. А тогда дестуктор - такой же член, как и метод. Что мешает договориться по нему?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.11.2014, 08:42
taras atavin, это всё очень условно. Автор предлагает опираться на тот факт, что на двоичном уровне вызов чисто виртуальных функций создаёт, если и не одинаковый, эквивалентный код. Деструктор на двоичном уровне не может быть чисто виртуальным, только семантически. В итоге мы можем себе позволить только невиртуальный деструктор. Результат -- мы вынуждены предоставить чисто виртуальный метод, который возьмёт на себя роль виртуального деструктора.

Но при любых условиях не используйте всё это на практике. Поработав некоторое время, я понял, что идея работы с интерфейсами С++ бессмысленна и небезопасна.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13241 / 6873 / 1827
Регистрация: 18.10.2014
Сообщений: 17,420
24.11.2014, 10:10
Цитата Сообщение от hoggy Посмотреть сообщение
Кстати, вызов метода по невалидному указателю так же является UB
C++
1
2
some* p = nullptr;
p->work();
И не важно, трогает ли метод work данные-члены, или нет. Это все равно UB.
Это на самом деле еще вилами по воде писано. Стандарт языка С++ изначально содержал дефект, согласно которому в нескольких местах стандарта упоминалось неопределенное поведение при разыменовании нулевого указателя, но при этом в описании унарного оператора '*' такое не декларировалось. Упоминания такого разыменования в качестве примеров UB были удалены из стандарта. Однако финального решения на тему того, можно ли разыменовывать нулевой указатель пока, похоже, не вынесено.

Эта тема много обсуждалась комитетом

http://www.open-std.org/jtc1/s... d.html#315
http://www.open-std.org/jtc1/s... e.html#232
(и по ссылкам)

Однако утверждение о том, что 'delete this' внутри метода класса порождает UB совершенно не верно. Все требования на валидность указателя 'this' относятся к явному или неявному использованию 'this' в выражениях. Никакого абстрактного требования чтобы 'this' был "просто так" всегда валиден в языке нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2014, 10:10

Можно ли заставить класс записывать самого себя в файл?
то есть class A{ int q,w,e; bool Write(); }; main(){ A a1; a1.write();// и он записывает сам себя в файл, не...

Как можно удалить или очистить тело макроса после его исполнения из самого себя?
Скажите пожалуйста! Как можно удалить или очистить тело макроса после его исполнения из самого себя?

Чем отличается объект класса от экземпляра класса
Читаю книгу "PHP Объекты, шаблоны и методики программирования" автор Мэт Зандстра. Перевод на русском. Там есть абзац про статические...

Зацыкливания класса на самого себя
scanner =new Scanner(System.in); System.out.println("Print"); if(scanner.hasNextInt()){int str=scanner.nextInt(); ...

Как экземпляру класса изменить тип самого себя?
Есть класс1, наследованный от класса класс-предок. Он лежит в list<класс-предок>. Нужно, не меняя его позиции в list'е, изменить его тип...


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

Или воспользуйтесь поиском по форуму:
68
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru