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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
djyuran
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 12
#1

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

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

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

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

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

Что значит строчка в коде - C++
Всем привет! что может значить след. строчки в коде? jn = (j>0)?(j-1):(LY-1) jp = (j<LY-1)?(j+1):(0) LY - задано, j -...

Подскажите что значит эта строка в коде - C++
#include <iostream> using namespace std; int zada4a3(int N) { return N == 0 ? 0 : (N % 10) + zada4a3(N / 10); //что это значит? ...

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

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

что значит ? - C++
что обозначает ? total += Добавлено через 2 минуты вот програма #include <stdio.h> #include <locale.h> #include <conio.h> ...

Что значит? - C++
std::cout << (myCircle.pointInCircle(x, y) ? "In circle" : "Out of circle"); Что означет эта строчка?

6
ManiaK
Сообщений: n/a
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 / 0
Регистрация: 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
2747 / 1848 / 266
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
13.11.2009, 20:52 #5
> pMyFoo->DoSmth(); // System crash

Вообще ведь здесь операция -> тоже может быть перегружена, а код этой перегрузки может выполнить любую проверку объекта или, скажем, проверку pMyFoo на нуль. Если же метод DoSmth не использует полЯ объекта, то он корректно выполнится даже без всяких перегрузок и даже при нулевом pMyFoo. Пусть, к примеру, его работа начинается с проверки указателя this и соответствующей реакции.
0
palva
2747 / 1848 / 266
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 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 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
14.11.2009, 00:07 #7
Отнюдь! Ваше первое объяснение было достаточным, но я просто решил не вступать в спор, потому что оно никак не противоречит моим коментариям. Я не утверждал, что использование указателя на NULL невозможно, я лишь заметил, что это некорректно и может привести к ошибкам (а может и не привести, как в приведенном вами примере).

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

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

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

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

Что значит ->? - C++
Наткнулся на непонятное место в непонятном коде. Оно показалось мне особенно непонятным, загуглить не получилось. Что значит: new...

Что значит new () - C++
Случайно ошибся и написал double *F1 = new double (count); вместо double *F1 = new double ; компилятор не выдал ошибки,но приложение не...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
14.11.2009, 00:07
Ответ Создать тему
Опции темы

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