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

Вниз

Как корректно проверить наличие объекта в памяти?   Найти похожие ветки 

 
Aleksandr ©   (2002-03-26 16:47) [0]

Ну достало то, что Assigned не проверяет реальное наличие объекта... Просто у меня в основном работа по переделке старых программ, в которых FreeAndNil и не пахнет, а вычищать все места, где было освобождение - замучаешься... Пытался сделать нечто вроде:

function InMemory(var P) : boolean;
begin
try
if (Pointer(P)<>nil) AND (TObject(P).ClassName<>"") then
Result:=true
else
Result:=false
except
on E:Exception do
Result:=false
end
end;

То есть просто пытался обратиться к свойству объекта... Оказалось, хрен-то там, конструкция типа TObject(P).ClassName никакого эксепшена не генерирует, хотя объект уничтожен. Как можно истчо обратиться к общему для всех объектов свойству, чтобы в случае его отсутствия произошла ошибка и функция сработала?


 
DieHard ©   (2002-03-26 16:59) [1]

ClassName - функция класса
Попробуй вызвать например ClassType


 
Aleksandr ©   (2002-03-26 17:45) [2]

Все равно не получается, млин... Кто-нить помнит из ассемблера что-нить по этому поводу?


 
oomneeq ©   (2002-03-26 18:14) [3]

Частично решается, если подозреваемый на недействительность обЪект учитывается в к-л глобальных списках
Например,
для TForm это Screen.Forms
туда же-
Components
Controls

тогда можно пробегаться по списку и глядеть, если нет такого в списке, значит недействителен, хоть и не nil.


 
Digitman ©   (2002-03-26 18:17) [4]

imho, даже ассемблер здесь никак не поможет.
Никаких гарантированных способов определения, существует ли объект по факту, нет. Ответственность за управлением временем жизни объекта целиком и полностью лежит на программере.


 
Aleksandr ©   (2002-03-26 18:40) [5]

вообще, с Controls и Components для общего случая - очень неплохо...
Но ведь в коде программы при обращении к проперти уничтоженного объекта генерируется исключение! Даже при отладке на наведение курсора к убитой проперти Дельфя генерирует эксепшн... Вот я и попытался сделать проверяльщик по тому же принципу: есть эксепт - нет объекта...


 
yaJohn ©   (2002-03-26 19:18) [6]

Неправильное решение. Вообще говоря результат непредсказуем. Чаще всего - действительно экзепшн.
Обьекты - стандартные или свои? Если свои... Можно попробовать так:

type
TMyBaseObject = class
public
constructor Create;
destructor Destroy; override;
end;
var
GlobalList: TList;

.....Create;
inherited;
GlobalList.Add(self);
end;

.......Destroy;
GlobalList.Remove(self);
inherited;
end;

begin
GlobalList:=TList.Create;
end;


Теперь мелочи. Заставить все свои обьекты наследоваться от TMyBaseObject


 
vuk ©   (2002-03-26 20:05) [7]

В принципе, если приложить усилия и перекомпилировать модуль system, то кое что можно узнать. Там есть две интересные функции, которые по-умолчанию отключены директивами компилятора, поскольку предназначены только для отладки.

function GetHeapBlocks: THeapBlockArray;
function FindObjects(AClass: TClass; FindDerived: Boolean): TObjectArray;

Одна из них дает доступ к блокам памяти в куче, а другая возвращает массив всех доступных экземпляров определенного класса в приложении.



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
7-22868
EsKor
2002-01-11 05:48
2002.04.08
Работа с COM-портом


1-22685
Kirill_Other
2002-03-26 09:51
2002.04.08
Как проверить имеет ли порожденный объект переопределенный метод?


14-22814
Alexander Vasjuk
2002-02-27 14:17
2002.04.08
Подключиться к 3Com хабу


3-22580
Макз
2002-03-17 15:57
2002.04.08
computed (by) fields


3-22534
Incha
2002-03-14 15:12
2002.04.08
Срочно нужна помощь.