Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
djyuran
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 12
1

Что значит delete this; в коде?

12.11.2009, 14:09. Просмотров 1232. Ответов 6
Метки нет (Все метки)

Вот видел такой код:

void Foo::Func()
{
... // какой-то код
delete this;
}

это как такое возможно. что вообще это обозначает. сами себя удаляем. а как же дальше выполняться???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2009, 14:09
Ответы с готовыми решениями:

Что значит строчка в коде
Всем привет! что может значить след. строчки в коде? jn =...

Подскажите что значит эта строка в коде
#include <iostream> using namespace std; int zada4a3(int N) { return N ==...

Sleep(8000) - что значит? На что можно заменить в борланд с++?
Не распознаёт Sleep(8000) . Если за комментировать пишет что f заданно но не...

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так...

Что значит?
std::cout << (myCircle.pointInCircle(x, y) ? "In circle" : "Out of circle"); ...

6
ManiaK
12.11.2009, 15:06 2
Да!! Что ты говоришь! А если в этом же классе будет перегружена функция operator delete()? Может в ней что-то такое таинственное делается? Хотя решение, конечно, варварское...
djyuran
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 12
12.11.2009, 15:09  [ТС] 3
функция delete не перегружена...
0
boombastik
7 / 7 / 11
Регистрация: 13.02.2007
Сообщений: 1,255
12.11.2009, 21:29 4
Оператор this возвращает указатель на конечный экземпляр представителя конкретного класса (в данном случае класса Foo).

Оперетор delete вызывает деструктор класса, на объект (экземпляр) которого ссылается указатель, следующий за оператором, а затем освобождает память отведенную под экземпляр этого класса используя стандартный менеджер памяти.

Таким образом, после вызова этой функции для конкретного экземпляра класса, все указатели на этот объект теряют свою актуальность и становятся (Bad Pointer) дальнейшее их использование приведет к ошибке в программе.

Смысл - инкапсулировать в касс функцию 'самоубийства', я бы назвал ее не Func(), а Suicide(). ;-)

Код
...
Foo* pMyFoo = new Foo();
// Работаем с pMyFoo
pMyFoo->DoSmth();
pMyFoo->WhatEver();
...
// Надоело работать с pMyFoo
pMyFoo->Func();
// Дальнейшее использование указателя pMyFoo некорректно
// и может приветси к ошибкам, возникающим при использовании 
// неправильных указателей.
pMyFoo->DoSmth(); // System crash
...
С уважением, Владимир
0
palva
3100 / 2232 / 450
Регистрация: 08.06.2007
Сообщений: 8,132
Записей в блоге: 4
13.11.2009, 20:52 5
> pMyFoo->DoSmth(); // System crash

Вообще ведь здесь операция -> тоже может быть перегружена, а код этой перегрузки может выполнить любую проверку объекта или, скажем, проверку pMyFoo на нуль. Если же метод DoSmth не использует полЯ объекта, то он корректно выполнится даже без всяких перегрузок и даже при нулевом pMyFoo. Пусть, к примеру, его работа начинается с проверки указателя this и соответствующей реакции.
0
palva
3100 / 2232 / 450
Регистрация: 08.06.2007
Сообщений: 8,132
Записей в блоге: 4
13.11.2009, 23:29 6
Я чувствую, что не очень понятно написал. Я имел ввиду, что следующий код работает корректно:
Код
#include <stdio.h>

class Foo {
public:
	int x;
	Foo* MySub() {
		if(this) {
			printf('%d
', x);
			delete this;
			return 0;
		} else {
			printf('null
');
			return this;
		}
	}
};
int main() {
	Foo *pf = new Foo;
	pf->x = 555;
	pf = pf->MySub(); // 555
	pf = pf->MySub(); // null
}
0
boombastik
7 / 7 / 11
Регистрация: 13.02.2007
Сообщений: 1,255
14.11.2009, 00:07 7
Отнюдь! Ваше первое объяснение было достаточным, но я просто решил не вступать в спор, потому что оно никак не противоречит моим коментариям. Я не утверждал, что использование указателя на NULL невозможно, я лишь заметил, что это некорректно и может привести к ошибкам (а может и не привести, как в приведенном вами примере).

Впрочем, по-моему, это уже отклонение от темы поставленной автором, хотя и отклонение в очень интересную область - магия с указателями в C++ (неплохое название для главы какой-нибудь книги по C++)

С уважением, Владимир.
0
14.11.2009, 00:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2009, 00:07

что значит /=
Бродил по форуму и наткнулся на вот такой синтаксис temp/=10; а что это значит

Что значит ->?
Наткнулся на непонятное место в непонятном коде. Оно показалось мне особенно...

Что значит ^= ?
нашел в коде данную фичу (язык С) не понимаю что конкретно она выполняет...


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

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

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