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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
#1

Вызов деструктора функцией-членом - C++

04.12.2009, 12:45. Просмотров 1582. Ответов 13
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class c
{
    public:
        c(){}
        ~c(){}
        void f(c* p){delete p;}
};
 
main()
{
    c* p = new c;
    p->f(p);
}
Корректны ли подобные операции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2009, 12:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов деструктора функцией-членом (C++):

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Вызов деструктора - C++
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора - C++
При ручном вызове деструктора, освобождается ли память*

Не понятный вызов деструктора - C++
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде: //разные инклюды MyClass var; int WinMain(...) { ...

Двойной вызов деструктора - C++
Здравствуйте, уважаемые. Вот столкнулся с такой проблемой... CharRow - это класс, который содержит указатель на строку... ...

13
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
04.12.2009, 12:55 #2
да т.к работает конструктор и деструктор
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2009, 13:08  [ТС] #3
ок, поправка: вопрос не в контроле за памятью, а в корректности самого подхода. Дело в том что участок 12строки неадекватно себя ведёт (в худшем случае - ломает работу приложения). И перед тем как зарываться в f(p) в поисках ошибки, хочется узнать, верен ли сам подход..
0
RazorQ
578 / 345 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
04.12.2009, 13:10 #4
Vladimir., вы пытаетесь удалить объект в самом же объекте. Т.е. объект удаляет сам себя. Это не будет работать. В 12 строке программа будет сваливаться.
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
04.12.2009, 13:22 #5
RazorQ,
вы пытаетесь удалить объект в самом же объекте. Т.е. объект удаляет сам себя.
в COM'е это обычная практика при release объекта (только там delete this)

Это не будет работать. В 12 строке программа будет сваливаться.
с чего это вдруг? вызов отработал, объект уничтожен.
0
RazorQ
04.12.2009, 13:26
  #6

Не по теме:

Я такого никогда не встречал. Спасибо. буду знать.

0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2009, 13:32  [ТС] #7
отлично, хотелось бы узнать следующее, как подобные вещи решаются?
в частности ближе к коду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class c
{
        public:
                c(){}
                ~c(){}
                void f()
                {
                      // здесь код который отрабатывая определяет some_pointer;
                      //исключение some_pointer == this
                      delete some_pointer;
                      
                }
};
 
main()
{
        c* p = new c;
        p->f();
}
Собственно, можно ли как-нибудь обработать такое исключение "силами" класса с??

Добавлено через 1 минуту
Rififi, то есть всё должно отрабатывать нормлаьно?
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,244
Записей в блоге: 28
04.12.2009, 13:59 #8
Цитата Сообщение от Rififi Посмотреть сообщение
Это не будет работать. В 12 строке программа будет сваливаться.
с чего это вдруг? вызов отработал, объект уничтожен.
Если в функции написано только "delete *p;", то это не значит, что в функции больше ничего не делается. Помимо написанного кода функция может делать какие-то дополнительные действия, причём каждый компилятор будет делать их по-своему, и при этом может понадобиться this (который мы по сути дела только что удалили)

Добавлено через 1 минуту
Vladimir., бужет лучше, если ты на словах объяснишь, чего же ты всё-таки хочешь
1
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2009, 17:12  [ТС] #9
Evg, да, всё верно, спасибо.

Vladimir., будет лучше, если ты на словах объяснишь, чего же ты всё-таки хочешь
список должен убивать последний узел в случае выполнения условия. В случае, когда условие выполнялось в последнем узле происходил вызов delete (this).
с решением пока не определился: до завтрашнего утра бага обьявлена фичей. С одной стороны убивать из вне очень не хочется, с другой стороны сама форма delete (this) очень смущает...
В любом случае вопрос актуален...
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,244
Записей в блоге: 28
04.12.2009, 17:54 #10
Как вариант последний узел внутри себя может себя отстыковать от предыдущего (т.е. топологически список окажется с удалённым последним эелментом), и в голову списка добавить какой-то флаг, который при следующем обращении к голове отработает и вызовет delete. С другой стороны, если деструктор делает какие-то действия, то такое поведение будет плохим

Добавлено через 1 минуту
Или как вариант через элемент списка получить доступ к предыдущему элементу, а через него уже удалять. Правда тут есть некий элемент черезж...сти, т.к. такое действие нельзя (нежелательно) делать методом класса, а нужно делать функцией, внешней к классу
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
04.12.2009, 18:48 #11
Цитата Сообщение от Vladimir. Посмотреть сообщение
список должен убивать последний узел в случае выполнения условия. В случае, когда условие выполнялось в последнем узле происходил вызов delete (this).
Как правильно написал Evg, это есть элемент черезж... хм.... выражаясь политкорректно, кривого дизайна.

Владеет элементами - список, это внешняя сущность по отношению к элементам. Он же их должен как вставлять, так и удалять; а не элемент должен "самоубиваться". Элементам же не должно быть никакого дела до того, содержатся ли они в некоем списке (вообще, контейнере, массиве... etc) или же находятся "в свободном полете".

Лечение простое: переделать дизайн.

PS: дизайн-ревью было? Каков результат?
1
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
05.12.2009, 01:08 #12
Evg,

Если в функции написано только "delete *p;", то это не значит, что в функции больше ничего не делается.

А что там ещё делается? system("format c:"); или SendHttpRequest("www.sex.com") ?

если только у тебя не говно-компилятор, который добавляет в код *** знает что, то delete this вызовет деструктор и освободит память.
(естессно если объект создан в куче а не на стеке)
0
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,244
Записей в блоге: 28
05.12.2009, 01:52 #13
> А что там ещё делается?

Без понятия, что там делается. Например, строится код по проводке исключительной ситуации или ещё какая-нибудь фигня - всё-таки Си++, а не Си

> если только у тебя не говно-компилятор

Если бы да кабы
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
07.12.2009, 10:02  [ТС] #14
Наиболее адекватная информация, которую удалось найти по этому вопросу:
[16.15] Is it legal (and moral) for a member function to say delete this?
Поскольку непонятно, как обеспечить выполнение четвертого пункта ( ибо я не могу сказать со 100% уверенностью что после компиляции всё будет гуд), а к нормальному решению вопроса быстро прийти не удалось, то - как рекомендовал CheshireCat - узлы будут выделены в отдельный класс.
Как временная мера на выходные: при создании списка создавался объект deth_node. При возникновении delete this ссылка на удаляемый узел передавалась в deth_node, для остальных объектов класса удаляемый считался удалённым. При повторной передаче deth_node ссылки, для предыдущей вызывался деструктор..
1
07.12.2009, 10:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2009, 10:02
Привет! Вот еще темы с ответами:

Повторный вызов деструктора - C++
{ bar b; b.~bar(); } В данном примере деструктор bar вызовется дважды. Как у уже удаленного объекта может вызываться...

Явный вызов деструктора - C++
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...

Явный вызов деструктора - C++
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать вектор объектов этого класса. ...

Автоматический вызов деструктора компилятором - C++
Хэлп, господа! Ситуация такая: имеется объект класса P, в нем парочка указателей на объекты класса С. В конструкторе P вызываются...


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

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

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