![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать, уничтожен ли объект. [D7, XP]
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]
месторасположение выделенной памяти, относительно адресного пространства приложения, никогда не меняется и менятся неможет в принципе