gluhow писал(а):Проблема в том что указатель может оказаться совершенно левым. И на преобразовании TObject(P) выскакивает SIGSEGV. Возможно ли это как-то решить или всё-таки придется править логику?
А как с этим справляются в многозадачном режиме? Когда нужно использовать объект который только был выделен в памяти но не про инициализирован? Где если прочитать его значения то они содержать мусор.
Кому верить?
Все давно уже решено и продумано. Не надо заниматься дроч. создавать на базе RTTI свою RTTI
Объект создается в одном потоке: если указатель на объект не нуль то объект явно создан, если он нуль то он не создан или был удален. Чтобы объект был явно занулен при удалении вместо
Object.Free нужно вызывать
FreeAndNil(Object) тогда указатель явно будет занулен, а объект разрушен.
Если вы выехали, прокатались, заехали в гараж и остановились - то никаких в жизни SIGSEGV не увидите.
В случае с многозадачностью - необходима блокировка(мьютекс, семафор,событие) чтобы понять в каком состоянии находится объект.
То есть в режиме одного потока - хватить проверка на nil, при многозадачном режиме - добавляются блокировки.
Добавлено спустя 8 часов 15 минут 1 секунду:gluhow писал(а):У меня немного странная задача: я отдельно сохраняю значение указателей памяти на некие объекты типа TTest
если необходимо работать со сылками на объекты - то нужно обеспечить синхронизацию и работать с объектами через ссылки если ( ссылки => объект ), по ссылки переходим на объект разрушаем, ссылку зануляем и/или удаляем, если это список.
Если нет возможности напрямую воздействовать на объект, он создается и удаляется в другой системе, то должна быть обратная связь на изменения состояния( Callback, Events) - синхронизация в обратную сторону ( ссылки <= объект ), тогда по событии просто зануляем и/или удаляем ссылку, если это список. Как пример сокеты, файловые переменные и тому пободное, вообще работа с OS происходить именно так, вы просите создать объект операционной системе, OS вам дает либо ссылку на объект либо как правило nil. Вся работа происходить через эту ссылку: проверка состояний, события.
Те же окна Form - само окно реально создается в OS вам дается ссылка(Handle) на это окно.
Добавлено спустя 31 минуту 25 секунд:gluhow писал(а):Проблема в том что указатель может оказаться совершенно левым.
Объекты обертки - вы создаете обертку со ссылкой на левый объект
Form <- это объект в вашей программе
+ Handle <- это некий указатель на объект в другой системе
сохраняете свою Form в списке и работаете с реальным объектом через Form.Handle
- Код: Выделить всё
type
TMyObject = class
FHandle:Pointer
end;
var
MyObjectList:TList<TMyObject>;
Function GetTTestFromP(P:Pointer):TMyObject;
var
myObj:TObject;
begin
Result:=nil;
for myObj in MyObjectList do
begin
if myObj.FHandle=P then begin
Result:=myObj;
break;
end;
end;
end;