Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
3-22594
gera-killer
2002-03-18 12:05
2002.04.08
Проблема с ДОС-кодировкой


1-22718
Yuri_V
2002-03-26 11:00
2002.04.08
Как передать в процедуру имя формы?


1-22751
Art1
2002-03-25 14:19
2002.04.08
Что нужно для ActiveX?


14-22807
QueenOfRain
2002-02-26 16:18
2002.04.08
Глупый вопрос, но все таки


3-22536
Kikoz
2002-03-14 12:18
2002.04.08
Как подключиться к АССЕSS через компонент TDataBase не регистрируюя алиас в BDE?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский