Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
-THE_MASTER666-
Заблокирован
1

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

18.11.2014, 15:10. Просмотров 3642. Ответов 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++-faq-lite/delete-this.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 15:10
Ответы с готовыми решениями:

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

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

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) {...

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

Можно ли получить ссылку на экземпляр класса по полю этого экземпляра
схематично код такой - class A { static void staticMethodA(SomeClass*...

67
DrOffset
8142 / 4723 / 1154
Регистрация: 30.01.2014
Сообщений: 7,693
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, независимо от контекста применения. Именно с этим (выделенным) все тут несогласны, именно этот тезис нуждается в подтверждении.

Давай я последний раз спрошу, если ты уверен в своих словах, смысловой эквивалент этой фразы из спецификации языка привести сможешь? Ты его приводишь, мы все дружно переосмысливаем свое мировосприятие и расходимся. Иначе толку в этом разговоре - нет.
1
taras atavin
4204 / 1766 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
23.11.2014, 19:13 62
И чем метод release лучше деструктора?
0
Croessmah
++Ͻ
14616 / 8368 / 1578
Регистрация: 27.09.2012
Сообщений: 20,563
Записей в блоге: 2
Завершенные тесты: 1
23.11.2014, 21:17 63
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем метод release лучше деструктора?
Почитайте внимательнее. Виртуальный деструктор делает код зависимым от используемого транслятора.
0
taras atavin
4204 / 1766 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
24.11.2014, 04:28 64
А release не делает? Чем таким загадочным именно деструктор хуже метода?
0
Croessmah
++Ͻ
14616 / 8368 / 1578
Регистрация: 27.09.2012
Сообщений: 20,563
Записей в блоге: 2
Завершенные тесты: 1
24.11.2014, 04:30 65
Цитата Сообщение от taras atavin Посмотреть сообщение
А release не делает?
Вы точно читали? Там написано что и как с виртуальными функциями происходит.
0
taras atavin
4204 / 1766 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
24.11.2014, 04:33 66
Там написано, что всё упирается в соглашение, а не в технические запреты. А тогда дестуктор - такой же член, как и метод. Что мешает договориться по нему?
0
mporro
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.11.2014, 08:42 67
taras atavin, это всё очень условно. Автор предлагает опираться на тот факт, что на двоичном уровне вызов чисто виртуальных функций создаёт, если и не одинаковый, эквивалентный код. Деструктор на двоичном уровне не может быть чисто виртуальным, только семантически. В итоге мы можем себе позволить только невиртуальный деструктор. Результат -- мы вынуждены предоставить чисто виртуальный метод, который возьмёт на себя роль виртуального деструктора.

Но при любых условиях не используйте всё это на практике. Поработав некоторое время, я понял, что идея работы с интерфейсами С++ бессмысленна и небезопасна.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4764 / 2423 / 677
Регистрация: 18.10.2014
Сообщений: 4,144
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/wg21/docs/cwg_closed.html#315
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
(и по ссылкам)

Однако утверждение о том, что 'delete this' внутри метода класса порождает UB совершенно не верно. Все требования на валидность указателя 'this' относятся к явному или неявному использованию 'this' в выражениях. Никакого абстрактного требования чтобы 'this' был "просто так" всегда валиден в языке нет.
0
24.11.2014, 10:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 10:10

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный...

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во...

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru