Свойство Delphi RTTI в памяти

После итерации моего списка свойств в классе с использованием RTTI я сохраняю его в переменной FMap: TDictionary<TRttiProperty, TMappedField>, а также сохраняю переменную FPropertyPK: TRttiProperty — использую ее для сопоставления полей базы данных. После этого я плавно обращаюсь к этой TDictionary и этой переменной в своих CRUD-функциях, в 4 проектах, где я использую этот класс, все работает отлично.

Однако я создал новый проект (эти другие были инициированы не мной), и просто после итерации, создания и добавления всего в TDictionary, в следующей функции, которую я вызываю, у меня возникают ошибки памяти, связанные со свойствами в ней, все приходит как nil. Но только конкретно в этом проекте, в других проектах работает тот же экран и та же функция.

Я сравнил варианты компиляции проекта один за другим и в этом новом проекте сделал все то же самое, но это не работает. В этом проекте Delphi уничтожает мою ссылку на память для всего, что связано с RTTI.

Есть решения?

Что касается закрытия из-за отсутствия деталей отладки: симптом использования уничтоженных экземпляров описан достаточно ясно, чтобы дать подсказку об основной причине. Я не понимаю, какую пользу принесет более подробная информация. Знаний о принадлежности объектов RTTI достаточно, чтобы дать правильный ответ на этот вопрос.

Uwe Raabe 12.07.2024 13:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Экземпляры RTTI принадлежат экземпляру TRTTIContext. Чтобы сохранить эти экземпляры живыми, вам нужно поддерживать живой контекст.

TRttiContext предоставляет для этого два метода класса: KeepContext и DropContext.

Поэтому вам нужно вызвать TRttiContext.KeepContext перед добавлением этих экземпляров в словарь и вызвать TRttiContext.DropContext, когда словарь будет уничтожен.

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

Другие вопросы по теме