Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 483
Завершенные тесты: 1
#1

delete this - C++

16.07.2013, 19:48. Просмотров 556. Ответов 6
Метки нет (Все метки)

Добрый день! У меня возник такой вопрос - почему в программе возникает неопределённое поведение для объекта, в деструкторе которого присутствует конструкция delete this? Ведь, по идеи, всё верно - удаляем объект по адресу, выходим из функции-деструктора и всё хорошо - объект больше память не занимает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 19:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос delete this (C++):

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс "умного" указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что "delete a, b;" эквивалентно "delete a; delete b;" ?

new - delete - C++
Добрый день. Выделяю память для записи 10 значений координат точки. #include <iostream> using namespace std; class point { ...

new delete - C++
здраствуйте! назрел вопрос class cls1 { ... ... } class cls2 { ... cls1 *pt = new cls1();

6
zer0mail
2447 / 2081 / 205
Регистрация: 03.07.2012
Сообщений: 7,563
Записей в блоге: 1
16.07.2013, 19:56 #2
http://firstdev.org/post/programmiro...-new-i-delete/
В задачу деструктора не входит освобождение памяти, которую занимает сам объект, т.е. delete this - это повторное удаление объекта, который уже в процессе уничтожения.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2013, 19:57 #3
поправлю:
Цитата Сообщение от zer0mail Посмотреть сообщение
т.е. delete this - это повторное удаление объекта, который уже в процессе уничтожения.
т.е. delete this в деструкторе - это повторное удаление объекта, который уже в процессе уничтожения.
0
zer0mail
2447 / 2081 / 205
Регистрация: 03.07.2012
Сообщений: 7,563
Записей в блоге: 1
16.07.2013, 20:03 #4
Имхо, фраза: "В задачу деструктора не входит освобождение памяти, которую занимает сам объект, т.е. delete this..." и подразумевает, что речь идет о деструкторе.
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 483
Завершенные тесты: 1
16.07.2013, 20:22  [ТС] #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;
Или я что-то упустил?
0
Kuzia domovenok
2130 / 1958 / 197
Регистрация: 25.03.2012
Сообщений: 6,821
Записей в блоге: 1
16.07.2013, 20:28 #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. Кто поправит, что не так?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2013, 21:06 #7
Цитата Сообщение от iRomul Посмотреть сообщение
1) Вызовется ли деструктор
вызовется

Добавлено через 1 минуту
Цитата Сообщение от iRomul Посмотреть сообщение
2) Опять же - почему выйдет неопределённое поведение?
неопределенное поведение выйдет если после delete this ещё использовать этот указатель
0
16.07.2013, 21:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 21:06
Привет! Вот еще темы с ответами:

New delete - C++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

New/Delete - C++
нужно рассмотреть конкретную ситуацию: область, выделенная желтым цветом будет очищена, при использовании delete, область выделенная...

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?

delete[] - C++
Здравствуйте! Имеется след. код: char* values = new char; values = '\0'; ////ещё код//// delete values; Вопрос - почему...


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

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

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