Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление самого себя

390
16 октября 2005 года
lexus
143 / / 13.04.2004
Как удалить самого себя (delete), используя указатель this?
10K
17 октября 2005 года
vse
38 / / 16.09.2005
Цитата:
Originally posted by lexus
Как удалить самого себя (delete), используя указатель this?


Так делать нельзя.
Но вообще можно просто delete this; Удивлюсь если не выйдет - смотри ассемблерный код тогда, который генерирует компилятор...

299
17 октября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by vse
Так делать нельзя.
Но вообще можно просто delete this; Удивлюсь если не выйдет - смотри ассемблерный код тогда, который генерирует компилятор...


Делать так действительно не рекомендуется.
Удалять должен всегда парент.

3
17 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
Делать так действительно не рекомендуется.
Удалять должен всегда парент.


Это не так.
Удаление самого себя вполне возможно, еслиты можешь гарантировать (программно), что после удаления объекта, к нему не будут обращаться.
Удалять самого себя, как уже говорилось, можно через
delete this;

299
17 октября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green
Это не так.
Удаление самого себя вполне возможно, еслиты можешь гарантировать (программно), что после удаления объекта, к нему не будут обращаться.
Удалять самого себя, как уже говорилось, можно через
delete this;


Согласен, просто на мой взгляд это является дурным стилем.
Обычно, кто создал. тот и удалил. Никакого самовольничества. Но это моё субъективное мнение.

395
18 октября 2005 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by 3D Bob
Согласен, просто на мой взгляд это является дурным стилем.
Обычно, кто создал. тот и удалил. Никакого самовольничества. Но это моё субъективное мнение.


Ну а разве COM объекты так не делают?

10K
18 октября 2005 года
vse
38 / / 16.09.2005
Цитата:
Originally posted by RelB
Ну а разве COM объекты так не делают?


Может они удаляют **this, но не *this, (где this ссылка, delete this - удаление *this). А потом уборщик мусора *this удалит.

И вообще если кто-то себя удаляет в "компиляторо-зависимой" библиотеке, на ассемблере, скажем то ничего страшного...

395
18 октября 2005 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by vse
Может они удаляют **this, но не *this, (где this ссылка, delete this - удаление *this). А потом уборщик мусора *this удалит.

И вообще если кто-то себя удаляет в "компиляторо-зависимой" библиотеке, на ассемблере, скажем то ничего страшного...


Да ну...
А я всегда почему-то думал что метод Release делает следующее:

 
Код:
ULONG CoClass::Release()
{
    InterlockedDecrement(&m_refCount);
    if(m_refCount == 0)
    {
        delete this;
        return 0;
    }
    return m_refCount;
}
13K
20 октября 2005 года
Санди
9 / / 16.10.2005
delete this - достаточно распространенный метод, когда необходимо создать объект и передать его child'у с тем, чтобы он его использовал, а потом, когда надо, сам позаботился об освобождении памяти. ИМХО если надо создать, например, поле ввода - контрол и передать его дочернему классу - чтобы он его обработал и смог возвратить данные, полученные от контрола - лучше и не придумаешь :)
Единственное, что надо помнить, что если ты передал ссылку на контрол, который должен удалиться сам, нельзя его потом использовать.
Чтобы не ошибаться, лучше делать new в вызове функции, так точно не возникнет ситуации, когда контрол удален, а ты его пытаешься использовать еще

P.S. А так, естественно, delete this
3
20 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Санди
delete this - достаточно распространенный метод, когда необходимо создать объект и передать его child'у с тем, чтобы он его использовал, а потом, когда надо, сам позаботился об освобождении памяти.


Что-то непонятно...
Пример плз.

Цитата:
Originally posted by Санди

ИМХО если надо создать, например, поле ввода - контрол и передать его дочернему классу - чтобы он его обработал и смог возвратить данные, полученные от контрола - лучше и не придумаешь :)


Ну можно придумать с десяток решений получше, а вот delete this я никак прикрутить к этой задаче не могу.
Ты про обработку OnDestroy ?

Цитата:
Originally posted by Санди

Единственное, что надо помнить, что если ты передал ссылку на контрол, который должен удалиться сам, нельзя его потом использовать.
Чтобы не ошибаться, лучше делать new в вызове функции, так точно не возникнет ситуации, когда контрол удален, а ты его пытаешься использовать еще

P.S. А так, естественно, delete this



Что-то у меня складывается впечатление из всего вышеприведенного, что ты имел в виду умный указатель, а там совсем не delete this.

299
20 октября 2005 года
3D Bob
885 / / 18.04.2005
а еще красиво делать вот так.

delete new Object();
Это код из моеё программы:)
13K
21 октября 2005 года
Санди
9 / / 16.10.2005
Цитата:
Originally posted by 3D Bob
а еще красиво делать вот так.

delete new Object();
Это код из моеё программы:)


Оччень продвинутый код.

А по существу - предлагаю посмотреть MFC Grid Control на CodeProject
В этом гриде очень красиво используется для создания и удаления различных ячеек delete this.

Поясню: ячейка грида может быть любым контролом (CEdit, CComboBox, CButton) но при создании конструктор создает объект и передает управление другому модулю, который при необходимости удаления (в их случае, потере контролом фокуса), уничтожает его delete this, не задумываясь, что это за контрол был. Чем плохое решение?

299
21 октября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Санди
Оччень продвинутый код.

А по существу - предлагаю посмотреть MFC Grid Control на CodeProject
В этом гриде очень красиво используется для создания и удаления различных ячеек delete this.

Поясню: ячейка грида может быть любым контролом (CEdit, CComboBox, CButton) но при создании конструктор создает объект и передает управление другому модулю, который при необходимости удаления (в их случае, потере контролом фокуса), уничтожает его delete this, не задумываясь, что это за контрол был. Чем плохое решение?


Ты говоришь уничтожает его, delete this - должно быть уничтожает себя.

3
21 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Санди
Оччень продвинутый код.


Если ты имеешь в виду:

 
Код:
delete new Object();

То код не так уж бессмыселен, как кажется.
Кстати чем он будет отличаться от такого кода:
 
Код:
{
  Object obj();
}


Цитата:
Originally posted by Санди

А по существу - предлагаю посмотреть MFC Grid Control на CodeProject
В этом гриде очень красиво используется для создания и удаления различных ячеек delete this.


Ну на счет красоты я не уверен... :)
Как и всё MFC-шное, этот код тоже монстроподобен.

Цитата:
Originally posted by Санди

уничтожает его delete this, не задумываясь, что это за контрол был. Чем плохое решение?


Никто не "уничтожает его", он сам себя уничтожает при приходе нотификации об уничтожении сабклассированного окна.
Решение стандартное вообще-то...
О нем я и упоминал в предыдущем посте:

Цитата:

Ты про обработку OnDestroy ?

299
21 октября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Green

 
Код:
{
  Object obj();
}


Тоже мысль))) Но тут имя переменной надо придумывать)) не люблю я это:)

3
21 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by 3D Bob
Тоже мысль))) Но тут имя переменной надо придумывать)) не люблю я это:)


Ну тогда ещё проще:

 
Код:
Object();

Кстати, в моём предыдущем примере ошибка. Кто-нибудь сможет объяснить в чем она?
406
21 октября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Green
Ну тогда ещё проще:
 
Код:
Object();

Кстати, в моём предыдущем примере ошибка. Кто-нибудь сможет объяснить в чем она?



Ошибка в наличии пустого конструктора ():
Object obj();

надо так:

{
Object obj;
}

Хотя это и не критичская ошибка и все скомпилится.

13K
21 октября 2005 года
Санди
9 / / 16.10.2005
Цитата:
Originally posted by 3D Bob
Ты говоришь уничтожает его, delete this - должно быть уничтожает себя.


Блин, ну посмотри исходник, прежде чем стебаться:o
Если тебt проще будет - это в InPlaceEdit

3
21 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vitaly2003s
Ошибка в наличии пустого конструктора ():
Object obj();

надо так:

{
Object obj;
}

Хотя это и не критичская ошибка и все скомпилится.


Это критическая ошибка и если даже скомпилится, то обязательно будет предупреждение, а корректной работы можно и не ждать.
Вопрос, почему?
Подсказка, найдите различия:
Object obj();
и
int func();

406
21 октября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Green
Это критическая ошибка и если даже скомпилится, то обязательно будет предупреждение, а корректной работы можно и не ждать.
Вопрос, почему?
Подсказка, найдите различия:
Object obj();
и
int func();



Думаю дело будет в отсутсвии обекта,его инициализации,переменных этого обекта и т.д. т.е. получится пустая переменная при вызове не являющяяся даже обетом класса. IMHO.
Вот что пишет компилятор:
warning C4930: 'CInputText copen1(void)': prototyped function not called (was a variable definition intended?)

Но как я заметил работать будет если не пытаться обратится к методам данного обекта или членам,вот тогда уже вылазиет ошибка на стадии компиляции типа переменная не является классом.

3
21 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vitaly2003s
Думаю дело будет в отсутсвии обекта,его инициализации,переменных этого обекта и т.д. т.е. получится пустая переменная при вызове не являющяяся даже обетом класса. IMHO.
Вот что пишет компилятор:
warning C4930: 'CInputText copen1(void)': prototyped function not called (was a variable definition intended?)

Но как я заметил работать будет если не пытаться обратится к методам данного обекта или членам,вот тогда уже вылазиет ошибка на стадии компиляции типа переменная не является классом.


Компилятор же тебе уже все подсказал.
Он считает конструкцию Object obj(); объявлением функции, а не созданием объекта, и , естественно, ничего не конструирует.

Я опять обращаю внимание отсутствие различий в записи
Object obj();
и
int func();

И то и другое - это объявление функции.

406
21 октября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Green
Компилятор же тебе уже все подсказал.
Он считает конструкцию Object obj(); объявлением функции, а не созданием объекта, и , естественно, ничего не конструирует.

Я опять обращаю внимание отсутствие различий в записи
Object obj();
и
int func();

И то и другое - это объявление функции.


Понятно. Интересно.

527
21 октября 2005 года
pavor
275 / / 28.09.2003
У меня
{
Object obj();
}
Прекрасно компилится
Object obj(); отличается от delete new Object(); тем, что первый только стек загадит, а второй - еще и заставит менеджер памяти сначала выделить объект в куче, а потом его от туда удалить.
3
22 октября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by pavor
У меня
{
Object obj();
}
Прекрасно компилится


Не может оно прекрасно компилится, если данный код находится внутри метода.
Либо не обращаешь внимание на варнинги, либо можешь выбросить компилятор на свалку.

276
22 октября 2005 года
Rebbit
1.1K / / 01.08.2005
Цитата:
Originally posted by Green

 
Код:
delete new Object();

То код не так уж бессмыселен, как кажется.



А действительно зачем ???
Если в конструкторе не затрагиваются статические поля или глобальные переменные, какую еще пользу можно получить ?

299
22 октября 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by Rebbit
А действительно зачем ???
Если в конструкторе не затрагиваются статические поля или глобальные переменные, какую еще пользу можно получить ?


Практика подскажет. Объект нужен для инициализации системы выполнить ожидание от пользователя, и уничтожится навсегда.

351
27 октября 2005 года
PitxBull
633 / / 22.12.2004
Удаление объектом самого себя вещь возможная, и в некоторых случаях достаточно удобная, но с моей точки зрения такая техника нарушает принципы объектно-ориентированного проектирования, а к чему ведет нарушение этих принципов вообщем то мне кажется известно всем...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог