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

Грязный хук.

01.03.2010, 11:17. Показов 3318. Ответов 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
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
01.03.2010, 11:52
Я видел только реализации Release в виде функионлаьно-подобного дефайна, в котором на самом деле упакован delete.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 12:32  [ТС]
Версия Release() написана не в полной мере, так как цель этой темы имеенно момент
delete this;
Как организованая модель клиент-> интерфейс-> компонент. я тут не обсуждаю.


Я видел только реализации Release в виде функионлаьно-подобного дефайна, в котором на самом деле упакован delete.
Эта вещь не подходит для данного мною контекста.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 14:06
Вообще вызывать delete внутри метода класса - не есть хорошо. Это уже на форуме где-то обсуждалось. А чего ты хочешь этим кодом добиться в конечном итоге?

Добавлено через 18 секунд
Вернее, чего хочешь добиться - понятно. Непонятно зачем
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 14:33  [ТС]
Вообще вызывать delete внутри метода класса - не есть хорошо.
Microsoft(r) начхать на это.
Ссылку давать не стоит.

В данном случае delete применимо только через указатель производного.

Мне интерсно как проихсодит правильное удаление: вызов деструктора.
Тип объекта определяется через this или как.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 14:41
Ты delete вызываешь в методе класса MyClass, в нём this имеет тип MyClass*, а потому и деструктор вызывается от класса MyClass

> Microsoft(r) начхать на это
А потом на свет появляется глючный софт, который перестаёт работать после обновлений системных библиотек или ОС

Я не очень понимаю, чем тебя не устраивает написать деструктор в базовом классе и нормально удалять объекты без извратов?
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 15:03
Цитата Сообщение от Evg Посмотреть сообщение
Вообще вызывать delete внутри метода класса - не есть хорошо.
С чем связано такое утверждение? Взять те же объекты, непосредственно поддерживающие счетчик ссылок - удаление как раз таки производится именно путем вызова delete this в операции уменьшения счетчика ссылок.
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 15:22  [ТС]
А потом на свет появляется глючный софт, который перестаёт работать после обновлений системных библиотек или ОС.
Умнее и универсальнее Microsoft(r) Direct Show я ничего не видел.

Добавлено через 6 минут
вызова delete this в операции уменьшения счетчика ссылок.
И больше ни как, потому что delete не может знать сколько указателей указывают на одну область памяти.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 15:24
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
С чем связано такое утверждение? Взять те же объекты, непосредственно поддерживающие счетчик ссылок - удаление как раз таки производится именно путем вызова delete this в операции уменьшения счетчика ссылок.
Компилятор Си++ помимо кода, который ты написал ручками, строит ещё и скрытые коды. Нехилый паравоз может вылезти из кода проводки исключительных ситуаций. Понятное дело, что если ограничиться только виндами и только микрософтовским компилятором, то проблем, скорее всего, не будет, потому как там почти наверняка работает что-ти типа libunwind (т.е. компилятор вообще ничего не строит по части раскрутки стека). Но можно ли считать подобный код переносимым на 100% - вопрос

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
удаление как раз таки производится именно путем вызова delete this в операции уменьшения счетчика ссылок.
Может я мысль неправильно понял, но мне казалось, что надо в деструкторе уменьшать счётчик, а не в процедуре уменьшения счётчика вызывать delete
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 15:32
Цитата Сообщение от Evg Посмотреть сообщение
Может я мысль неправильно понял, но мне казалось, что надо в деструкторе уменьшать счётчик, а не в процедуре уменьшения счётчика вызывать delete
Зачем уменьшать счетчик если объект фактически уже удален?

Обычно объекты, поддерживающие счетчик ссылок имеют пару методов для уменьшения/увеличения счетчика ссылок. В методе уменьшения счетчика при его обнулении происходит удаление объекта.
Простой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ClassWithRefCounter
{
public:
  ClassWithRefCounter()
  : ref_count(1)
  {}
   
  void AddRef()
  {
    ++ref_count;
  }
 
  void Release()
  {
    if(--ref_count == 0)
      delete this;
  }
 
private:
  int ref_count;
}
Клиенты при создании новой ссылки на объект вызывают AddRef, при удалении ссылки Release.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 15:35  [ТС]
переносимым на 100% - вопрос
Не беспокойся COM скоро и на Lunix переедет.
Evg:
Ты же не знаешь что такое COM поэтому тему лучше не раздувать по пусту,
тем более что ответ я уже получил.

Может я мысль неправильно понял, но мне казалось, что надо в деструкторе уменьшать
счётчик
Такой хук в деструкторах, делают "smatr_ptr" интеллектуальные указатели.
CyBOSSeR скорее всего имеет ввиду компоненты COM.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 15:39
Цитата Сообщение от Genius Ignat Посмотреть сообщение
CyBOSSeR скорее всего имеет ввиду компоненты COM.
Объекты, поддерживающие счетчик ссылок используется далеко не только в COM.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 15:46  [ТС]
Такой хук в деструкторах, делают "smatr_ptr" интеллектуальные указатели.
Без этого ни как, иначе возможно удаление объекта во время его использования,
из - за того что указатели указывают на одну область памяти.

Добавлено через 5 минут
Объекты, поддерживающие счетчик ссылок используется далеко не только в COM
Ну скорее всего там где они используются, картина аналогична картине COM,

так как использование указателей которые указывают на одну область памяти, должно
быть с счетчиком ссылок, иначе будет не безопасно.
Это моё субъективное мнение.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 16:10
После примера, я понял, что имелось в виду под "счётчиком ссылок"

Добавлено через 9 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Простой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ClassWithRefCounter
{
public:
  ClassWithRefCounter()
  : ref_count(1)
  {}
   
  void AddRef()
  {
    ++ref_count;
  }
 
  void Release()
  {
    if(--ref_count == 0)
      delete this;
  }
 
private:
  int ref_count;
}
Метод Release нельзя вызывать из другого метода класса. Этого, на мой взгляд, достаточно для того, чтобы такое действие считалось невалидным
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
01.03.2010, 16:15  [ТС]
нельзя вызывать из другого метода класса
Наверное произойдет что то страшное.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 16:27
С точки зрения стандарта

Добавлено через 10 минут
Правда в стандарте ничего по этому поводу не нашёл
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 16:34
Цитата Сообщение от Evg Посмотреть сообщение
Метод Release нельзя вызывать из другого метода класса. Этого, на мой взгляд, достаточно для того, чтобы такое действие считалось невалидным
Метод Release не предназначен для вызова из методов самого класса, у него другое назначение - его должны вызывать клиенты, когда необходимость в ссылке на объект отпадает.
Такой подход как раз таки используется в технологии COM.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 16:41
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Метод Release не предназначен для вызова из методов самого класса, у него другое назначение - его должны вызывать клиенты, когда необходимость в ссылке на объект отпадает
Я сейчас о говорю не о самой технике, а о том, насколько допустимым считается подобное действие с точки зрения стандарта. У меня сейчас что-то типа "ж..й чую, что литр, но доказать не могу"
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 17:03
Цитата Сообщение от Evg Посмотреть сообщение
Я сейчас о говорю не о самой технике, а о том, насколько допустимым считается подобное действие с точки зрения стандарта.
По поводу delete this, никаких упоминаний в стандарте нет.
Это легальная операция, если память выделена с помощью оператора new и никаких обращений к указателю this после вызова delete this не последует.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.03.2010, 18:08
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это легальная операция, если память выделена с помощью оператора new и никаких обращений к указателю this после вызова delete this не последует.
Она условно легальная. Т.е. такой метод можно вызывать только вне класса. А такое ограничение наводит на подозрение о нелегальности
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2010, 18:08
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru