Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 12

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

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

Студворк — интернет-сервис помощи студентам
Вот видел такой код:

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

это как такое возможно. что вообще это обозначает. сами себя удаляем. а как же дальше выполняться???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2009, 14:09
Ответы с готовыми решениями:

Что значит public string T и все что дальше в приведенном коде?
class String { private string A; public String() { } public string T { ...

Что значит 'i' в коде?
function f(n : integer) : real; function func(i:integer):real; begin if i > n then func := 0 else func:=Sqrt(i +...

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

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

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

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

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
...
Foo* pMyFoo = new Foo();
// Работаем с pMyFoo
pMyFoo->DoSmth();
pMyFoo->WhatEver();
...
// Надоело работать с pMyFoo
pMyFoo->Func();
// Дальнейшее использование указателя pMyFoo некорректно
// и может приветси к ошибкам, возникающим при использовании 
// неправильных указателей.
pMyFoo->DoSmth(); // System crash
...
С уважением, Владимир
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
13.11.2009, 20:52
> pMyFoo->DoSmth(); // System crash

Вообще ведь здесь операция -> тоже может быть перегружена, а код этой перегрузки может выполнить любую проверку объекта или, скажем, проверку pMyFoo на нуль. Если же метод DoSmth не использует полЯ объекта, то он корректно выполнится даже без всяких перегрузок и даже при нулевом pMyFoo. Пусть, к примеру, его работа начинается с проверки указателя this и соответствующей реакции.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
13.11.2009, 23:29
Я чувствую, что не очень понятно написал. Я имел ввиду, что следующий код работает корректно:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
14.11.2009, 00:07
Отнюдь! Ваше первое объяснение было достаточным, но я просто решил не вступать в спор, потому что оно никак не противоречит моим коментариям. Я не утверждал, что использование указателя на NULL невозможно, я лишь заметил, что это некорректно и может привести к ошибкам (а может и не привести, как в приведенном вами примере).

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

С уважением, Владимир.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2009, 00:07
Помогаю со студенческими работами здесь

Что значит a[0] в этом коде
Что значит a в этом коде? def min_max(a): if a: maximum = a minimum = a for i in a: ...

Что значит exp в коде?
в решении задачи присутсвует вот такая строчка if (exp(i*ln(x))&gt;max) then max:=exp(i*ln(x)) никак не пойму, что значит exp, знаю что это...

Что значит в коде Space$(128)
Доброго времени. Подскажите, пожалуйста, что в выражении VolumeName = Space$(128) означает Space$(128)? (VolumeName As String)

Что значит Graphics^ в данном коде?
#pragma endregion bool Drow; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { this-&gt;Text = &quot;Рисование...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru