Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010

Грязный хук.

01.03.2010, 11:17. Показов 3723. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Провёл не большой анализ по одному коду, и выянил не которые особенности,
о которых не пишут в книгах о языке C++.
Это я узнал из книги INside COM.

Также помню не в тему спор завёл где то на форме, про виртуальный деструктор и
где его надо прописывать.
Правильнее и безопаснее прописывать конечно везде, если не брать концепцию COM.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream.h>
class Abstract {
public:
/*Абстрактному классу не нужен виртуальный деструктор потому что Release может действовать и без него,
*/
virtual long Release() = 0;
};
class MyClass: public Abstract  {
public:
    MyClass(){ cout<<"Create MyClass\n"; }
    virtual ~MyClass() {cout<<"Destroy\n"; }
    
virtual long Release(){
/*подразумивается как delete obj, верно ли я предполагаю, поэтому деструктор вызывается с нужного места  иерархии: тоесть с производного класса.
*/  delete this;                
             return 0;
    }
};
 
 
int main(){
MyClass  *obj = new MyClass;
Abstract *aobj = obj;
aobj->Release();
//delete aobj; не сработает так как в базовом нет виртуального деструктора.
return 0;
}
Тогда получается COM компонент явно через delete( к указателю базового класса) не удалить,
так как в базовом классе отстутсвует виртуальный деструктор.

Я то знаю почему надо что бы delete не работало, мне это известно.

Я просто хочу узнать у более опытных прогеров верно ли мое предположение о том как действует
Release():
/*подразумивается как delete obj, верно ли я предполагаю, поэтому деструктор вызывается с нужного места иерархии: тоесть с производного класса.
*/
Или применяется ещё что то.
Ответьте пожалейста, заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.03.2010, 11:17
Ответы с готовыми решениями:

Глобальный хук клавиатуры
Привет. Мне нужно сделать глобальный хук клавиатуры, но я не знаю как. В интернете примеров на C++ мало и все не работают, потому что люди...

хук (нужен компил)
Нужен компил хука (исходники в атаче) или подскажите какой компилятор использовался

Глобальный хук. Довести до ума
Здравствуйте, решил изучить механизмы хуков, почитал статьи. Появились вопросы. Вот собственно если делать глобальный хук, то функцию...

32
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 18:13
Студворк — интернет-сервис помощи студентам
Evg, по поводу условий легальности delete this: [16.15] Is it legal (and moral) for a member function to say delete this?
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 18:18  [ТС]
CyBoSSeR:
Оперативно.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
01.03.2010, 18:32
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Evg, по поводу условий легальности delete this: [16.15] Is it legal (and moral) for a member function to say delete this?
А у тебя есть 100% уверенности по всем пунктам, которые написаны в этом факе? Т.е. если ты между delete и return не написал ни одной строки, то есть у тебя гарантия 100%, что между ними компилятор не наплодит какого-то кода (хотя бы по части exception'ов, о которых писал выше), который может зацепить this?

Добавлено через 8 минут
Просто вот о чём я пишу:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class T
{
public:
  T();
  ~T();
};
 
extern int func2 (void);
 
int func (void)
{
  T t;
 
  return func2();
}
Функция func проще некуда, однако код нехилый

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
25
26
27
28
29
30
31
32
33
34
35
...
        call    _Z5func2v, 0  <--- это вызов func2
         nop
.LLEHE1:
        mov     %o0, %l0
        add     %fp, -24, %g1
        mov     %g1, %o0
.LLEHB2:
        call    _ZN1TD1Ev, 0  <--- это вызов деструктора t (ожидаемо)
         nop
.LLEHE2:
        st      %l0, [%fp-28]
        b       .LL1    <---- это переход в конец процедуры (на return)
         nop
.LL6:
        st      %i0, [%fp-32]  <--- отсюда начинается код по размотке стека
.LL2:
        ld      [%fp-32], %l0
        add     %fp, -24, %g1
        mov     %g1, %o0
        call    _ZN1TD1Ev, 0
         nop
        st      %l0, [%fp-32]
.LL4:
        ld      [%fp-32], %o0
.LLEHB3:
        call    _Unwind_Resume, 0
         nop
.LLEHE3:
.LL1:
        ld      [%fp-28], %i0  <--- вот здесь реальный выход из процедуры
        ret
        restore
.LLFE2:
        .size   _Z4funcv, .-_Z4funcv
Данный тест не совсем подходит к нашей теме, поскольку в процедуре мы имеем локал типа класс. Но точно ли нет ситуаций, когда в "простом" методе не выскочит вот такой вот код. Я плохо владею плюсами, чтоы экспериментировать. Может для этого нужно какое-то ацкое множественное виртуальное наследование или ещё что-то типа того. К тому же здесь используется версия gcc, умеющая работать с libunwind, а другие компиляторы могут это дело реализовывать по другому и механизм будетболее тяжёлым
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 19:07  [ТС]
Если б Release(); портило всю малину его бы не использовали.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 19:08
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Evg Посмотреть сообщение
А у тебя есть 100% уверенности по всем пунктам, которые написаны в этом факе? Т.е. если ты между delete и return не написал ни одной строки, то есть у тебя гарантия 100%, что между ними компилятор не наплодит какого-то кода (хотя бы по части exception'ов, о которых писал выше), который может зацепить this?
Да, я практически на 100% уверен, что если все приведенные пункты соблюдены, то проблем с использованием конструкции delete this не будет.

Кроме того, компиляторы разрабатывают не идиоты (я на это очень надеюсь), и никаких лишних обращений к this компилятор не наплодит, при условии что у программиста, использующего конструкцию, руки растут из правильного места.

Насчет исключений, вопрос также сводится к "пряморукости" программиста.

Опять же, я не знаю способа, позволяющего обойтись без данной конструкции при разработке объектов, непосредственно поддерживающих счетчик ссылок.
3
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 19:14  [ТС]
"пряморукости" программиста.
В точку.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
01.03.2010, 20:38
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Кроме того, компиляторы разрабатывают не идиоты (я на это очень надеюсь), и никаких лишних обращений к this компилятор не наплодит, при условии что у программиста, использующего конструкцию, руки растут из правильного места.
Я не пытаюсь оспаривать этот факт. Я просто спрашиваю, насколько ты уверен. Я в Си++ не специалист, а потому не могу оценивать подобные вещи "навскидку".

> Если б Release(); портило всю малину его бы не использовали

Его используют только под виндами на мелкомягком компиляторе или на всех архитектурах?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 21:19  [ТС]
Evg:
COM в основном распространен на платформах майкрософт.
Evg:
Хотел спросить если ты в сеть выходишь с Lunix, поддерживает ли твой Web браузер
ActiveX компоненты.
Мне даже самому интересно, ActiveX же построена на COM.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
01.03.2010, 21:22
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Хотел спросить если ты в сеть выходишь с Lunix, поддерживает ли твой Web браузер
ActiveX компоненты.
Мне даже самому интересно, ActiveX же построена на COM.
Это что? Типа видео с ютуба. Такое поддерживает
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 21:26  [ТС]
http://www.emanual.ru/download... .ru_1.html
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
01.03.2010, 21:29
Допустим, я всё это прочту, дальше то что? Не проще ли покзать на какой-нибудь сайт, тыкнуть пальцем и сказать "вот эта вот штука - это и есть ActiveХ"
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 21:38
Цитата Сообщение от Evg Посмотреть сообщение
Я просто спрашиваю, насколько ты уверен.
Данная конструкция легальна с точки зрения языка и я на 100% уверен, что при осторожном обращении, данная конструкция безопасна.

Но все же, если есть возможность избежать ее использования, то так и следует поступить, чтобы ненароком не наступить на грабли.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 21:56  [ТС]
на mail.ru
Если я в свое браузере отключаю поддержку ActiveX
Тогда рисунок, который рекламирует браузер IE8(microft) исчезает.

Добавлено через 6 минут
Если я в свое браузере отключаю поддержку ActiveX
Тогда рисунок, который рекламирует браузер IE8(microft) исчезает.
Это false ;высказывание.

Короче ActiveX это какая нибудь нестандартная кнопочка на странице либо ещё какая-нибудь феня.
Что бы искать сайты на которых висят ActiveX мне надо тратить время, но на mail.ru точно что то
есть иначе браузер бы не запрещал загрузку ActiveX.
На cyberforum мой браузер не реагирует.

Добавлено через 1 минуту
Короче не бери в голову, про этот ActiveX.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2010, 21:56

Грязный фон
Как вы верстаете страницы с фоном &quot;грязными пятнами&quot; типа того, что в приложенной картинки? Я обычно мучаю дизайнеров, чтоб он вырезал мне...

Грязный и чистый PR
Недавно столкнулся с мнением, что есть PR первого сорта и PR второго сорта. Прямо это не высказывалось, но... Меня интересует мнение о...

Грязный код
Чем плох для поисковика грязный код ХТМЛ? Например после MsWord? Только тем что отношение текст/теги стремиться у нулю? а как на это дело...

Micro SD 16gb Грязный бит
Подскажите пожалуйста, что можно сделать с сдешкой 16Гб c грязным битом. Я форматировал СДешку и получилось так что закрыл окно...

Kyocera TASKalfa 2200 грязный фон
Видел разные проблемы печати, но сейчас я в растерянности. Kyocera 2200 стала давать грязный фон на листе (см вложение. Лист подается...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru