Заблокирован
1

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

18.11.2014, 15:10. Показов 12123. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2014, 15:10
Ответы с готовыми решениями:

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

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

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

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

67
16093 / 8691 / 2124
Регистрация: 30.01.2014
Сообщений: 14,978
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
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.11.2014, 19:13 62
И чем метод release лучше деструктора?
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
23.11.2014, 21:17 63
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем метод release лучше деструктора?
Почитайте внимательнее. Виртуальный деструктор делает код зависимым от используемого транслятора.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.11.2014, 04:28 64
А release не делает? Чем таким загадочным именно деструктор хуже метода?
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
24.11.2014, 04:30 65
Цитата Сообщение от taras atavin Посмотреть сообщение
А release не делает?
Вы точно читали? Там написано что и как с виртуальными функциями происходит.
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.11.2014, 04:33 66
Там написано, что всё упирается в соглашение, а не в технические запреты. А тогда дестуктор - такой же член, как и метод. Что мешает договориться по нему?
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.11.2014, 08:42 67
taras atavin, это всё очень условно. Автор предлагает опираться на тот факт, что на двоичном уровне вызов чисто виртуальных функций создаёт, если и не одинаковый, эквивалентный код. Деструктор на двоичном уровне не может быть чисто виртуальным, только семантически. В итоге мы можем себе позволить только невиртуальный деструктор. Результат -- мы вынуждены предоставить чисто виртуальный метод, который возьмёт на себя роль виртуального деструктора.

Но при любых условиях не используйте всё это на практике. Поработав некоторое время, я понял, что идея работы с интерфейсами С++ бессмысленна и небезопасна.
0
С чаем беда...
Эксперт CЭксперт С++
10001 / 5350 / 1464
Регистрация: 18.10.2014
Сообщений: 12,896
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/s... d.html#315
http://www.open-std.org/jtc1/s... e.html#232
(и по ссылкам)

Однако утверждение о том, что 'delete this' внутри метода класса порождает UB совершенно не верно. Все требования на валидность указателя 'this' относятся к явному или неявному использованию 'this' в выражениях. Никакого абстрактного требования чтобы 'this' был "просто так" всегда валиден в языке нет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2014, 10:10
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru