Удаление самого себя
Как удалить самого себя (delete), используя указатель this?
Так делать нельзя.
Но вообще можно просто delete this; Удивлюсь если не выйдет - смотри ассемблерный код тогда, который генерирует компилятор...
Так делать нельзя.
Но вообще можно просто delete this; Удивлюсь если не выйдет - смотри ассемблерный код тогда, который генерирует компилятор...
Делать так действительно не рекомендуется.
Удалять должен всегда парент.
Делать так действительно не рекомендуется.
Удалять должен всегда парент.
Это не так.
Удаление самого себя вполне возможно, еслиты можешь гарантировать (программно), что после удаления объекта, к нему не будут обращаться.
Удалять самого себя, как уже говорилось, можно через
delete this;
Это не так.
Удаление самого себя вполне возможно, еслиты можешь гарантировать (программно), что после удаления объекта, к нему не будут обращаться.
Удалять самого себя, как уже говорилось, можно через
delete this;
Согласен, просто на мой взгляд это является дурным стилем.
Обычно, кто создал. тот и удалил. Никакого самовольничества. Но это моё субъективное мнение.
Согласен, просто на мой взгляд это является дурным стилем.
Обычно, кто создал. тот и удалил. Никакого самовольничества. Но это моё субъективное мнение.
Ну а разве COM объекты так не делают?
Ну а разве COM объекты так не делают?
Может они удаляют **this, но не *this, (где this ссылка, delete this - удаление *this). А потом уборщик мусора *this удалит.
И вообще если кто-то себя удаляет в "компиляторо-зависимой" библиотеке, на ассемблере, скажем то ничего страшного...
Может они удаляют **this, но не *this, (где this ссылка, delete this - удаление *this). А потом уборщик мусора *this удалит.
И вообще если кто-то себя удаляет в "компиляторо-зависимой" библиотеке, на ассемблере, скажем то ничего страшного...
Да ну...
А я всегда почему-то думал что метод Release делает следующее:
{
InterlockedDecrement(&m_refCount);
if(m_refCount == 0)
{
delete this;
return 0;
}
return m_refCount;
}
Единственное, что надо помнить, что если ты передал ссылку на контрол, который должен удалиться сам, нельзя его потом использовать.
Чтобы не ошибаться, лучше делать new в вызове функции, так точно не возникнет ситуации, когда контрол удален, а ты его пытаешься использовать еще
P.S. А так, естественно, delete this
delete this - достаточно распространенный метод, когда необходимо создать объект и передать его child'у с тем, чтобы он его использовал, а потом, когда надо, сам позаботился об освобождении памяти.
Что-то непонятно...
Пример плз.
ИМХО если надо создать, например, поле ввода - контрол и передать его дочернему классу - чтобы он его обработал и смог возвратить данные, полученные от контрола - лучше и не придумаешь :)
Ну можно придумать с десяток решений получше, а вот delete this я никак прикрутить к этой задаче не могу.
Ты про обработку OnDestroy ?
Единственное, что надо помнить, что если ты передал ссылку на контрол, который должен удалиться сам, нельзя его потом использовать.
Чтобы не ошибаться, лучше делать new в вызове функции, так точно не возникнет ситуации, когда контрол удален, а ты его пытаешься использовать еще
P.S. А так, естественно, delete this
Что-то у меня складывается впечатление из всего вышеприведенного, что ты имел в виду умный указатель, а там совсем не delete this.
delete new Object();
Это код из моеё программы:)
а еще красиво делать вот так.
delete new Object();
Это код из моеё программы:)
Оччень продвинутый код.
А по существу - предлагаю посмотреть MFC Grid Control на CodeProject
В этом гриде очень красиво используется для создания и удаления различных ячеек delete this.
Поясню: ячейка грида может быть любым контролом (CEdit, CComboBox, CButton) но при создании конструктор создает объект и передает управление другому модулю, который при необходимости удаления (в их случае, потере контролом фокуса), уничтожает его delete this, не задумываясь, что это за контрол был. Чем плохое решение?
Оччень продвинутый код.
А по существу - предлагаю посмотреть MFC Grid Control на CodeProject
В этом гриде очень красиво используется для создания и удаления различных ячеек delete this.
Поясню: ячейка грида может быть любым контролом (CEdit, CComboBox, CButton) но при создании конструктор создает объект и передает управление другому модулю, который при необходимости удаления (в их случае, потере контролом фокуса), уничтожает его delete this, не задумываясь, что это за контрол был. Чем плохое решение?
Ты говоришь уничтожает его, delete this - должно быть уничтожает себя.
Оччень продвинутый код.
Если ты имеешь в виду:
То код не так уж бессмыселен, как кажется.
Кстати чем он будет отличаться от такого кода:
Object obj();
}
А по существу - предлагаю посмотреть MFC Grid Control на CodeProject
В этом гриде очень красиво используется для создания и удаления различных ячеек delete this.
Ну на счет красоты я не уверен... :)
Как и всё MFC-шное, этот код тоже монстроподобен.
уничтожает его delete this, не задумываясь, что это за контрол был. Чем плохое решение?
Никто не "уничтожает его", он сам себя уничтожает при приходе нотификации об уничтожении сабклассированного окна.
Решение стандартное вообще-то...
О нем я и упоминал в предыдущем посте:
Ты про обработку OnDestroy ?
Object obj();
}
Тоже мысль))) Но тут имя переменной надо придумывать)) не люблю я это:)
Тоже мысль))) Но тут имя переменной надо придумывать)) не люблю я это:)
Ну тогда ещё проще:
Кстати, в моём предыдущем примере ошибка. Кто-нибудь сможет объяснить в чем она?
Ну тогда ещё проще:
Кстати, в моём предыдущем примере ошибка. Кто-нибудь сможет объяснить в чем она?
Ошибка в наличии пустого конструктора ():
Object obj();
надо так:
{
Object obj;
}
Хотя это и не критичская ошибка и все скомпилится.
Ты говоришь уничтожает его, delete this - должно быть уничтожает себя.
Блин, ну посмотри исходник, прежде чем стебаться:o
Если тебt проще будет - это в InPlaceEdit
Ошибка в наличии пустого конструктора ():
Object obj();
надо так:
{
Object obj;
}
Хотя это и не критичская ошибка и все скомпилится.
Это критическая ошибка и если даже скомпилится, то обязательно будет предупреждение, а корректной работы можно и не ждать.
Вопрос, почему?
Подсказка, найдите различия:
Object obj();
и
int func();
Это критическая ошибка и если даже скомпилится, то обязательно будет предупреждение, а корректной работы можно и не ждать.
Вопрос, почему?
Подсказка, найдите различия:
Object obj();
и
int func();
Думаю дело будет в отсутсвии обекта,его инициализации,переменных этого обекта и т.д. т.е. получится пустая переменная при вызове не являющяяся даже обетом класса. IMHO.
Вот что пишет компилятор:
warning C4930: 'CInputText copen1(void)': prototyped function not called (was a variable definition intended?)
Но как я заметил работать будет если не пытаться обратится к методам данного обекта или членам,вот тогда уже вылазиет ошибка на стадии компиляции типа переменная не является классом.
Думаю дело будет в отсутсвии обекта,его инициализации,переменных этого обекта и т.д. т.е. получится пустая переменная при вызове не являющяяся даже обетом класса. IMHO.
Вот что пишет компилятор:
warning C4930: 'CInputText copen1(void)': prototyped function not called (was a variable definition intended?)
Но как я заметил работать будет если не пытаться обратится к методам данного обекта или членам,вот тогда уже вылазиет ошибка на стадии компиляции типа переменная не является классом.
Компилятор же тебе уже все подсказал.
Он считает конструкцию Object obj(); объявлением функции, а не созданием объекта, и , естественно, ничего не конструирует.
Я опять обращаю внимание отсутствие различий в записи
Object obj();
и
int func();
И то и другое - это объявление функции.
Компилятор же тебе уже все подсказал.
Он считает конструкцию Object obj(); объявлением функции, а не созданием объекта, и , естественно, ничего не конструирует.
Я опять обращаю внимание отсутствие различий в записи
Object obj();
и
int func();
И то и другое - это объявление функции.
Понятно. Интересно.
{
Object obj();
}
Прекрасно компилится
Object obj(); отличается от delete new Object(); тем, что первый только стек загадит, а второй - еще и заставит менеджер памяти сначала выделить объект в куче, а потом его от туда удалить.
У меня
{
Object obj();
}
Прекрасно компилится
Не может оно прекрасно компилится, если данный код находится внутри метода.
Либо не обращаешь внимание на варнинги, либо можешь выбросить компилятор на свалку.
То код не так уж бессмыселен, как кажется.
А действительно зачем ???
Если в конструкторе не затрагиваются статические поля или глобальные переменные, какую еще пользу можно получить ?
А действительно зачем ???
Если в конструкторе не затрагиваются статические поля или глобальные переменные, какую еще пользу можно получить ?
Практика подскажет. Объект нужен для инициализации системы выполнить ожидание от пользователя, и уничтожится навсегда.