Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать, уничтожен ли объект. [D7, XP]


Страницы:   1 2 3

Terasbetoni ©   (2008-10-02 18:44:00) 

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


oxffff   (2008-10-02 20:07:00) [21]


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


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


Palladin   (2008-10-02 19:58:00) [22]


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

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


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


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

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


oxffff   (2008-10-02 19:48:00) [24]


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


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

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


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


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


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

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


oldman   (2008-10-02 19:46:00) [26]

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


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

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

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

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


Palladin   (2008-10-02 19:43:00) [28]


> Terasbetoni   (02.10.08 19:42) [16]

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


Palladin   (2008-10-02 19:42:00) [29]


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

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


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

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


oxffff   (2008-10-02 19:40:00) [31]

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

SysReallocMem(object,object.instancesize)

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

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


Palladin   (2008-10-02 19:39:00) [32]

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


oldman   (2008-10-02 19:37:00) [33]


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


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


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

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

{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:27:00) [35]


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


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


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


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

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


Palladin   (2008-10-02 19:26:00) [37]


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

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


oldman   (2008-10-02 19:25:00) [38]


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


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


oldman   (2008-10-02 19:23:00) [39]


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


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

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


Palladin   (2008-10-02 19:23:00) [40]


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо