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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

delete this - C++

05.08.2012, 20:01. Просмотров 1408. Ответов 4
Метки нет (Все метки)

Какие последствия могут быть при выполнении команды
C++
1
delete this;
из какой-нибудь функции члена?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2012, 20:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос 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++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

new[] - delete[] - C++
Всем привет. Глупый вопрос, но тем не менее, он меня крайне заинтересовал. Вот например, есть такой код: void main() { int...

4
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
05.08.2012, 20:03 #2
Цитата Сообщение от ramybozy Посмотреть сообщение
Какие последствия могут быть при выполнении команды
C++
1
delete this;
из какой-нибудь функции члена?
попробуй и расскажи. самое захватывающее - из конструктора
2
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.08.2012, 20:04 #3
http://www.parashift.com/c++-faq/delete-this.html
только в деструкторе не вызывай, иначе будет рекурсия
1
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.08.2012, 22:33 #4
Последствий заведомо не будет только в том случае, если одновременно а) в функции-члене после delete this не производится никаких действий с объектом; б) на вызывающей стороне не производится никаких дальнейших действий с объектом; и в) если на вызывающей стороне этот объект не уничтожается (то есть, он должен быть создан через new без парного delete).
Возможные последствия такого баловства:
- попытка проведения операций с уже уничтоженным объектом и, более узко
- попытка повторного удаления уже удалённого объекта (вызов деструктора на уже уничтоженном объекте)
Эти два пункта могут остаться без последствий, могут привести к аварийному завершению программы, если страница памяти, в которой был объект, освободилась, или к непредсказуемым последствиям (порча неизвестно каких данных), если этот участок памяти был снова выделен программе уже под другой объект. Дополнительно, эффекты работы с уничтоженным/переписанным объектом зависят от реализации самого класса и могут варьироваться от "без последствий" до аварийных завершений или происходящей "втихаря" порчи содержимого памяти в произвольном месте (то есть, любая переменная, массив, объект, возможно даже участки программного кода).
- попытка повторного освобождения уже освобождённой памяти (может игнорироваться)
В общем, потенциальный геморрой настолько богат и разнообразен, что обещает множество увлекательных часов, проведённых за отладкой и отчаянным вырыванием на себе волос.
1
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
06.08.2012, 00:35  [ТС] #5
Еще раз огромное спасибо Jupiter и Nick Alte.
Эта штуковина очень помогла мне только что при решении задачи о раскладывании данного набора камней по двум кучам, так чтобы разность весов в кучах оказалась минимальной.
Это уже в другой ветке, если будет кому интересно, выложу код.
Там
C++
1
delete this
используется очень активно, так как решение реализовано в виде класса, который порождает другие аналогичные более эффективные с точки зрения решения классы, так что начальные элементы нет смысла хранить в памяти с тем, чтобы рекурся не слишком сильно давила.
0
06.08.2012, 00:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2012, 00:35
Привет! Вот еще темы с ответами:

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

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

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

new и delete - C++
как лучше очищать память? #include <stdio.h> #include <stdlib.h> //как лучще очищать память? int main(){ char *buff...


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

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

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