Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
-THE_MASTER666-
Заблокирован
18.11.2014, 15:10     Можно ли удалить объект экземпляра класса из самого себя? #1
Привет!
Допустим:
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++-faq-lite/delete-this.html
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 15:10     Можно ли удалить объект экземпляра класса из самого себя?
Посмотрите здесь:

C++ Сложение экземпляра базового класса и экземпляра наследника
C++ Можно ли получить ссылку на экземпляр класса по полю этого экземпляра
Можно ли заставить класс записывать самого себя в файл? C++
C++ Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
Явное создание экземпляра класса и явная специализация шаблона класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6442 / 3816 / 885
Регистрация: 30.01.2014
Сообщений: 6,610
23.11.2014, 16:15     Можно ли удалить объект экземпляра класса из самого себя? #61
Цитата Сообщение от 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, независимо от контекста применения. Именно с этим (выделенным) все тут несогласны, именно этот тезис нуждается в подтверждении.

Давай я последний раз спрошу, если ты уверен в своих словах, смысловой эквивалент этой фразы из спецификации языка привести сможешь? Ты его приводишь, мы все дружно переосмысливаем свое мировосприятие и расходимся. Иначе толку в этом разговоре - нет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.11.2014, 19:13     Можно ли удалить объект экземпляра класса из самого себя? #62
И чем метод release лучше деструктора?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,889
Записей в блоге: 2
Завершенные тесты: 1
23.11.2014, 21:17     Можно ли удалить объект экземпляра класса из самого себя? #63
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем метод release лучше деструктора?
Почитайте внимательнее. Виртуальный деструктор делает код зависимым от используемого транслятора.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.11.2014, 04:28     Можно ли удалить объект экземпляра класса из самого себя? #64
А release не делает? Чем таким загадочным именно деструктор хуже метода?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,889
Записей в блоге: 2
Завершенные тесты: 1
24.11.2014, 04:30     Можно ли удалить объект экземпляра класса из самого себя? #65
Цитата Сообщение от taras atavin Посмотреть сообщение
А release не делает?
Вы точно читали? Там написано что и как с виртуальными функциями происходит.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.11.2014, 04:33     Можно ли удалить объект экземпляра класса из самого себя? #66
Там написано, что всё упирается в соглашение, а не в технические запреты. А тогда дестуктор - такой же член, как и метод. Что мешает договориться по нему?
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2014, 08:42     Можно ли удалить объект экземпляра класса из самого себя? #67
taras atavin, это всё очень условно. Автор предлагает опираться на тот факт, что на двоичном уровне вызов чисто виртуальных функций создаёт, если и не одинаковый, эквивалентный код. Деструктор на двоичном уровне не может быть чисто виртуальным, только семантически. В итоге мы можем себе позволить только невиртуальный деструктор. Результат -- мы вынуждены предоставить чисто виртуальный метод, который возьмёт на себя роль виртуального деструктора.

Но при любых условиях не используйте всё это на практике. Поработав некоторое время, я понял, что идея работы с интерфейсами С++ бессмысленна и небезопасна.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 10:10     Можно ли удалить объект экземпляра класса из самого себя?
Еще ссылки по теме:

C++ Создание нового экземпляра дочернего класса из экземпляра базового
C++ Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Передача свойства одного экземпляра класса другому экземпляру класса C++

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

Или воспользуйтесь поиском по форуму:
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2902 / 1438 / 397
Регистрация: 18.10.2014
Сообщений: 2,652
24.11.2014, 10:10     Можно ли удалить объект экземпляра класса из самого себя? #68
Цитата Сообщение от hoggy Посмотреть сообщение
Кстати, вызов метода по невалидному указателю так же является UB
C++
1
2
some* p = nullptr;
p->work();
И не важно, трогает ли метод work данные-члены, или нет. Это все равно UB.
Это на самом деле еще вилами по воде писано. Стандарт языка С++ изначально содержал дефект, согласно которому в нескольких местах стандарта упоминалось неопределенное поведение при разыменовании нулевого указателя, но при этом в описании унарного оператора '*' такое не декларировалось. Упоминания такого разыменования в качестве примеров UB были удалены из стандарта. Однако финального решения на тему того, можно ли разыменовывать нулевой указатель пока, похоже, не вынесено.

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

http://www.open-std.org/jtc1/sc22/wg...losed.html#315
http://www.open-std.org/jtc1/sc22/wg...ctive.html#232
(и по ссылкам)

Однако утверждение о том, что 'delete this' внутри метода класса порождает UB совершенно не верно. Все требования на валидность указателя 'this' относятся к явному или неявному использованию 'this' в выражениях. Никакого абстрактного требования чтобы 'this' был "просто так" всегда валиден в языке нет.
Yandex
Объявления
24.11.2014, 10:10     Можно ли удалить объект экземпляра класса из самого себя?
Ответ Создать тему
Опции темы

Текущее время: 17:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru