Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.28;
Скачать: CL | DM;

Вниз

Объект, вызвавший данный метод?   Найти похожие ветки 

 
VaS ©   (2002-11-18 11:33) [0]

Как получить указатель на объект, вызвавший данный метод другого объекта?
Конкретно.
Имеем проблему: RefCount > 0 в деструкторе.
Нужно: выяснить в каких местах программы не вызывается Release().
Идея: Отслеживаем, кто вызывает _AddRef(), заносим указатель на него в список. В _Release() ищем в списке такой указатель и удаляем его. Т.е. будут дубликаты указателей на один и тот же объект, удалять будем, соответственно, один из указателей. В деструкторе можно получить список оставшихся указателей. Этого достаточно.
Посмотрел исходник MemCheck. Его функции всегда возвращают в качестве вызывающего (Caller) TBaseClass._AddRef(), что ничего не дает :( (TBaseClass - базовый класс моей иерархии).
Возникло подозрение, что _AddRef() вызывается уже позже QueryInterface() (или as).
Есть идеи?


 
kull ©   (2002-11-18 11:47) [1]

Оператор as всегда увеличивает счетчик ссылок.


 
kull ©   (2002-11-18 12:02) [2]

И еще хитрый момент.

procedure DoSomesting(itf: IMyInterface2);
begin
....
end;

....
var
MyInterface: IMyInterface1;
begin
MyInterface := TMyInterface1.Create;
DoSomething(MyInterface as IMyInterface2);
//после этого вызова объект класса TMyInterface1 прекращает
//сущесвование.
end;


Поэтому лучше объявлять:

procedure DoSomesting(const itf: IMyInterface2);
или
procedure DoSomesting(var itf: IMyInterface2);


 
VaS ©   (2002-11-18 12:04) [3]

Стэк получить удалось. Но это не решает проблемы. Невозможно отследить где же не вызывается Release().


 
VaS ©   (2002-11-18 12:05) [4]

kull: Да, этот момент известен.


 
VaS ©   (2002-11-18 13:05) [5]

up


 
Юрий Федоров ©   (2002-11-18 13:09) [6]

А как вообще пошел деструктор, если RefCount > 0? Руками его кто-то разрушает что-ли? Или руками пишутся AddRef"ы и Release"ы?


 
VaS ©   (2002-11-18 14:00) [7]

Да, руками пишется IUnknown.



Страницы: 1 вся ветка

Текущий архив: 2002.11.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-93096
Lony
2002-11-17 01:55
2002.11.28
Копирование в буфер


4-93307
Игорь2
2002-10-18 19:55
2002.11.28
Общий и свободный объем диска больше 4 ГБ


3-92939
voice_inf
2002-11-12 00:49
2002.11.28
Как в поле таблицы типа Graphik поместить изображение Jpg


6-93173
kofman
2002-10-02 13:20
2002.11.28
Как добавит сой пункт в контекстное меню MSIE?


4-93301
sas1
2002-10-17 15:44
2002.11.28
вопрос