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

Вниз

Как узнать, уничтожен ли объект.   Найти похожие ветки 

 
Terasbetoni   (2008-10-02 18:44) [0]

Здравствуйте.
У меня есть указатель на некоторый адрес памяти. Ранее этот указатель указывал на некоторый объект. Затем этот объект, возможно, был удален. Как узнать теперь, имея в распоряжении этот указатель, был объект удален или нет.


 
Palladin ©   (2008-10-02 18:49) [1]

никак


 
Поросенок Винни-Пух ©   (2008-10-02 18:51) [2]

указатель - нитка, объект - шарик с гелием.
режем нитк, шарик улетает и через два часа пробуем по нитке угадать, лопнул шарик или нет.

это то что ты пытаешься сделать.


 
oldman ©   (2008-10-02 19:05) [3]

Причем (имхо) объект может быть жив, но отсутствовать по данному адресу.
Свапование, мать его!


 
Городской Шаман   (2008-10-02 19:19) [4]


> oldman ©   (02.10.08 19:05) [3]
>
> Причем (имхо) объект может быть жив, но отсутствовать по
> данному адресу.
> Свапование, мать его!


Это как? У каждого процесса в пользовательском режиме чистенькие виртуальные 2Гб памяти, у которых при загрузке и выгрузке страниц адреса не изменяются.


 
Правильный$Вася   (2008-10-02 19:22) [5]


> Как узнать теперь, имея в распоряжении этот указатель, был
> объект удален или нет.

только обратиться к нему и анализировать Exception, если возникнет
хотя никаких гарантий


 
Palladin ©   (2008-10-02 19:23) [6]


> oldman ©   (02.10.08 19:05) [3]

месторасположение выделенной памяти, относительно адресного пространства приложения, никогда не меняется и менятся неможет в принципе


 
oldman ©   (2008-10-02 19:23) [7]


> Городской Шаман   (02.10.08 19:19) [4]


А в сабже не сказано, по какому адресу лезет программа...
Может тупо по физическому в оперативку?

зы: наступали мы и на эти грабли.


 
oldman ©   (2008-10-02 19:25) [8]


> Palladin ©   (02.10.08 19:23) [6]


А Вы писали на С++ for DOS?
Там иногда указание адреса интерпретировалось не как выделенное, а как общее.


 
Palladin ©   (2008-10-02 19:26) [9]


> Может тупо по физическому в оперативку?

нет, защищенный режим процессора потому защищенным и называется


 
Palladin ©   (2008-10-02 19:27) [10]


> oldman ©   (02.10.08 19:25) [8]

писал на паскале для DOS, потому и говорю, не нужно путать real и protected mode


 
oldman ©   (2008-10-02 19:27) [11]


> Palladin ©   (02.10.08 19:26) [9]


Прощу пардона за остатки былых граблей...


 
oxffff ©   (2008-10-02 19:34) [12]

Попробуй порыть в направлении

{Returns information about the current state of the memory manager}
procedure GetMemoryManagerState(var AMemoryManagerState: TMemoryManagerState);

{Gets the state of every 64K block in the 4GB address space}
procedure GetMemoryMap(var AMemoryMap: TMemoryMap);

Сейчас еще кое что попробую


 
oldman ©   (2008-10-02 19:37) [13]


> Как узнать, уничтожен ли объект.


А так, вообще, понятие флагов отменили?
Или программа не твоя?
Или объект не твой?


 
Palladin ©   (2008-10-02 19:39) [14]

для начала вообще нужно удостовериться, что имеет ввиду аффтор под термином "указатель на объект"...


 
oxffff ©   (2008-10-02 19:40) [15]

Еще есть вариант более хитрый способ, но менее точный

SysReallocMem(object,object.instancesize)

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

Гарантий на этот способ нет. Нужно тестировать. :)


 
Terasbetoni   (2008-10-02 19:42) [16]

oldman ©   (02.10.08 19:37) [13]
как организовать учёт сторонним ресурсом, это понятно... думал, что можно не делать собственную систему учёта.


 
Palladin ©   (2008-10-02 19:42) [17]


> oxffff ©   (02.10.08 19:40) [15]

а ты представляешь себе насколько этот способ разрушителен? ))
типа как определить настоящая купюра или нет, а поджечь ее надо, если настоящая то пепел водяные знаки покажет :))


 
Palladin ©   (2008-10-02 19:43) [18]


> Terasbetoni   (02.10.08 19:42) [16]

вот интересно, откуда вдруг появились сторонние ресурсы... только что вели речь об объектах в контексте Делфи....


 
oldman ©   (2008-10-02 19:43) [19]

Пожалуй, я повторю [13]

Если я пишу программу и пользую некоторый объект, то после его удаления я поставлю флаг на невозможность обращение к данному объекту.

В чем проблема?


 
oldman ©   (2008-10-02 19:46) [20]

Пока писал [19] появился "сторонний ресурс".
Сразу вынимаем из небытия вопрос о "выделенной памяти"...


 
Сергей М. ©   (2008-10-02 19:48) [21]


> Затем этот объект, возможно, был удален.


Святым духом, наверно ?

Т.е. кем угодно, только не тобой собственноручно ?


 
oxffff ©   (2008-10-02 19:48) [22]


> Palladin ©   (02.10.08 19:42) [17]
>
> > oxffff ©   (02.10.08 19:40) [15]
>
> а ты представляешь себе насколько этот способ разрушителен?
>  ))
> типа как определить настоящая купюра или нет, а поджечь
> ее надо, если настоящая то пепел водяные знаки покажет :
> ))


Я то это прекрасно понимаю.
Если на этом месте что-то есть, то от этого что-то скопируется в новое положение. Но гарантии что это что-то есть экземляр нет. Поэтому я использую термин "что-то". Хуже если  "что-то" это что-то другое, от которого мы отрезали кусок в другое место. :)

еще есть
oxffff ©   (02.10.08 19:34) [12]


 
Palladin ©   (2008-10-02 19:56) [23]


>  Но гарантии что это что-то есть экземляр нет.

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


 
Palladin ©   (2008-10-02 19:58) [24]


> еще есть
> oxffff ©   (02.10.08 19:34) [12]

а это да, уже более реальный выход, но никто не может гарантировать валидность данных по адресу, в случае перераспределения того же участка под другие нужды... так что, только "святой дух" (С) Сергей М. :) молится надобно..


 
oxffff ©   (2008-10-02 20:07) [25]


> Palladin ©   (02.10.08 19:56) [23]


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


 
oxffff ©   (2008-10-02 20:14) [26]


> oxffff ©   (02.10.08 20:07) [25]


В управляемых кучах все объекты, а они несет в себе тип.
Технически в native Delphi можно реализовать менеджер памяти, чтобы ответить на вопросы:

1. Является указатель на объект - указателем на объект.
2. Является ли объект объектом этого типа.

Но нужно слегка изменить способы выделения памяти.


 
Palladin ©   (2008-10-02 20:16) [27]


> oxffff ©   (02.10.08 20:14) [26]

ты не понял, что я имею в виду.

Procedure proc3(o:TObject);
var
l:TObject;
Begin
переинстанцирование l
End;

Procedure proc2(o:TObject);
var
l:TObject;
Begin
l:=o;
proc3(l);
работа с l
End;

Procedure proc1(o:TObject);
var
l:TObject;
Begin
l:=o;
proc2(l);
Работа с l
End;


теперь понял?


 
oxffff ©   (2008-10-02 20:22) [28]


> Palladin ©   (02.10.08 20:16) [27]


Я то все сразу понял. Есть понятия корня-это то что сслылается в кучу.
Поэтому если ты что сдвинул, то нужно изменить все корни на это сдвинутое, включая корни в других объектах кучи.  
Здесь нужно делать вручную, в отличии от управляемой кучи.
Я и написал oxffff ©   (02.10.08 20:07) [25]
:))


 
Palladin ©   (2008-10-02 20:26) [29]

хм, считаешь, управляемая куча сможет переопределить новое значение, замест старого, указателя, находящегося в стеке? )


 
oxffff ©   (2008-10-02 20:27) [30]


> Palladin ©   (02.10.08 20:16) [27]


Можно написать проще.
procedure abc;
var a,b:Tobject;
begin
a:=Tobject.create;
b:=a;
a:=sysrealloc(a,a.instanceSize);
b:=a;
end;

А вообще лучше забить на это и использовать семантику копирования интерфейса, только избегать зацикливания ссылок.


 
oldman ©   (2008-10-02 20:28) [31]


> Palladin ©  
> oxffff ©  


Ребята, вы сейчас автора топика отправите в нокаут!


 
oxffff ©   (2008-10-02 20:29) [32]


> Palladin ©   (02.10.08 20:26) [29]


Управляемая куча так и работает, когда делает уплотнение.
Изменяет все ссылки на этот объект самостоятельно.


 
Palladin ©   (2008-10-02 20:29) [33]


> oxffff ©   (02.10.08 20:27) [30]

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


 
Palladin ©   (2008-10-02 20:32) [34]


> oxffff ©   (02.10.08 20:29) [32]

то есть, я так понимаю, грубо говоря, тот же механизм что и с типами, с управляемым временем жизни?


 
oxffff ©   (2008-10-02 20:33) [35]


> Palladin ©   (02.10.08 20:32) [34]


Не понял вопроса. Поясни please. :)


 
Palladin ©   (2008-10-02 20:36) [36]

ну имеются ввиду, типы Variant, интерфейсы, дин. массивы и т.д.... за состоянием их идентификаторов следит rtl... управляющая куча должна иметь, примерно, тот же механизм, дабы отслеживать работу с идентификаторами и определять валидность ссылки...


 
Palladin ©   (2008-10-02 20:37) [37]

тьфу, управляемая куча :)


 
oxffff ©   (2008-10-02 20:48) [38]


> Palladin ©   (02.10.08 20:36) [36]


Нет, это другое. Управляемым временем жизни - это просто дополнительная семантика копирования типа. Здесь ведется подсчет ссылок на объект для освобождения. Однако здесь нельзя просто переместить объект поскольку ведется только количество клиентов типа, а установить клиентов существенно затруднено. В управляемой кучи идея проще не нужно вести количество клиентов, но нужно вести самих клиентов, причем только ключевых, тех по которым рекурсивно можно определить всех остальных неявных. Поэтому нет никакой нагрузки на доп. инфу типа счетчик ссылок, атомарное его изменение и саму семантику копирования. Однако нет детерменированного способа освобождения объекта, и поэтому и финализации, однако есть общий подход к детерминированной финализации.


 
oxffff ©   (2008-10-02 20:50) [39]

offtop
Блин думаю, почему же я так хочу есть.
Только сейчас понял, что я же не ел после работы.


 
Terasbetoni   (2008-10-02 21:18) [40]

oldman ©   (02.10.08 19:43) [19]
oldman ©   (02.10.08 19:43) [20]

под сторонним ресурсом я имею ввиду некоторую переменную, находящуюся ВНЕ (потому и стороннюю) объекта, в которой будет располагаться информация о состоянии актуальности объекта. это и есть флаг, о котором вы говорите.

Palladin ©   (02.10.08 19:39) [14]
а что, под термином "указатель на объект" можно подразумевать разные вещи?


 
oldman ©   (2008-10-02 21:20) [41]


> Terasbetoni   (02.10.08 21:18) [40]
> под сторонним ресурсом я имею ввиду некоторую переменную,
>  находящуюся ВНЕ (потому и стороннюю) объекта


чаво?


 
oldman ©   (2008-10-02 21:22) [42]


> Terasbetoni   (02.10.08 21:18) [40]


а кто мешает до обращения к переменной проверить возможность обращения?


 
oldman ©   (2008-10-02 21:27) [43]

Типа

if flag then Обрабатываем_Перемпенyую
else Ты_Че_С_Ума_Сошел_?


 
Сергей М. ©   (2008-10-03 08:32) [44]


> Terasbetoni   (02.10.08 21:18) [40]


> некоторую переменную, находящуюся ВНЕ (потому и стороннюю)
> объекта, в которой будет располагаться информация о состоянии
> актуальности объекта


Ничто не мешает невзначай загадить содержимое такой переменной, равно как и сам объект, на которую ссылается переменная.

Один кривой шаг в кривом алгоритме - и вся схема "контроля актуальности" летит коту под хвост)

Лучший способ навести порядок в своем программно-объектном хозяйстве - ни на секунду не допускать в нем бардака и непонимания где что в какой момент лежит, что где и с чем происходит, кто в какой момент времени ответственен за создание и утилизацию тех или иных объектов .. и т.д. и т.п.


 
Palladin ©   (2008-10-03 08:36) [45]


> а что, под термином "указатель на объект" можно подразумевать
> разные вещи?

конечно
p:TObject; - указатель на объект
p:^TObject; - "указатель" на объект



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

Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.007 c
15-1221554711
melehov
2008-09-16 12:45
2008.11.16
Самоцель:создать БД для себя и всеобщего пользования сотрудников


15-1221345698
Per Pra
2008-09-14 02:41
2008.11.16
"Perfect Prattle" или "Идеальная потрепаловка - 2"


15-1221678183
@!!ex
2008-09-17 23:03
2008.11.16
Программа для создания врапперов


9-1154513135
@!!ex
2006-08-02 14:05
2008.11.16
Можно ли реализовать Bump без использования шейдеров?


2-1223343510
Developer
2008-10-07 05:38
2008.11.16
Несколько Form в проекте,Показ Формы.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский