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

delete this - C++

Восстановить пароль Регистрация
 
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
16.07.2013, 19:48     delete this #1
Добрый день! У меня возник такой вопрос - почему в программе возникает неопределённое поведение для объекта, в деструкторе которого присутствует конструкция delete this? Ведь, по идеи, всё верно - удаляем объект по адресу, выходим из функции-деструктора и всё хорошо - объект больше память не занимает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 19:48     delete this
Посмотрите здесь:

C++ delete и delete[]
"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
new - delete C++
C++ new и delete
C++ delete[]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,656
Записей в блоге: 1
16.07.2013, 19:56     delete this #2
http://firstdev.org/post/programmiro...-new-i-delete/
В задачу деструктора не входит освобождение памяти, которую занимает сам объект, т.е. delete this - это повторное удаление объекта, который уже в процессе уничтожения.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2013, 19:57     delete this #3
поправлю:
Цитата Сообщение от zer0mail Посмотреть сообщение
т.е. delete this - это повторное удаление объекта, который уже в процессе уничтожения.
т.е. delete this в деструкторе - это повторное удаление объекта, который уже в процессе уничтожения.
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,656
Записей в блоге: 1
16.07.2013, 20:03     delete this #4
Имхо, фраза: "В задачу деструктора не входит освобождение памяти, которую занимает сам объект, т.е. delete this..." и подразумевает, что речь идет о деструкторе.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
16.07.2013, 20:22  [ТС]     delete this #5
Хорошо, вопрос действительно глупый (ответ, правда, я осознал после того, как опубликовал сообщение )
Тогда вот что:
Если мы делаем delete this из функции-члена класса то:
1) Вызовется ли деструктор
2) Опять же - почему выйдет неопределённое поведение?
Ведь выходит что:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
 
  A();
  ~A();
 
  void self_d() {delete this;}
 
};
 
int main() {
  
  A* a = new A;
  return EXIT_SUCCESS;
 
}
здесь a это то же, что и this внутри а. И тогда self_d() должна отработать так же, как и delete a;
Или я что-то упустил?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 20:28     delete this #6

Не по теме:

будет ошибка в строке 13, т.к. конструктор приватный и объект создать нельзя.
Но это придирки. Мы все поняли, что имелось в виду ЭТО! ->


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
public:
    A(){};
    ~A(){};
 
  void self_d() {delete this;}
 
};
 
int main() {
  
  A* a = new A;
  a->self_d();
  return EXIT_SUCCESS;
 
}
Такой код теоретически должен выполниться без последствий. Но только если метод self_d вызывается для указателя на объект, выделенный new. Кто поправит, что не так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 21:06     delete this
Еще ссылки по теме:

C++ new и delete
New/Delete C++
New delete C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2013, 21:06     delete this #7
Цитата Сообщение от iRomul Посмотреть сообщение
1) Вызовется ли деструктор
вызовется

Добавлено через 1 минуту
Цитата Сообщение от iRomul Посмотреть сообщение
2) Опять же - почему выйдет неопределённое поведение?
неопределенное поведение выйдет если после delete this ещё использовать этот указатель
Yandex
Объявления
16.07.2013, 21:06     delete this
Ответ Создать тему
Опции темы

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