Как правильно освобождать ресурсы TJSONData

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как правильно освобождать ресурсы TJSONData

Сообщение GreyCrazyWolf » 29.02.2024 09:44:21

Добрейшего времени суток.
Хотелось бы уточнить как правильно освобождать ресурсы при работе с TJSONData (fpjson)
Имеется приложение (демон) на astralinux, приложение реализует подобие REST интерфейса.
Есть метод
Код: Выделить всё
// Смена статуса учетки
procedure THlpSrv.stateEmploeeEndpoint(ARequest: TRequest; AResponse: TResponse);
var
  JsonData       : TJSONData;
  FindJsonData   : TJSONData = nil;   
.....

при вызове метода получаем json из тела запроса
Код: Выделить всё
JsonData   := GetJSON(ARequest.Content);

затем, необходимо проверить существование и если есть - получить значение атрибута
Код: Выделить всё
FindJsonData := JsonData.FindPath('isEmployeeLocked');
                if FindJsonData <> nil then
                    begin
                       accState := not FindJsonData.IsNull and FindJsonData.AsBoolean = True;     
.....

в общем, все хорошо, все работает за исключением финализации
Код: Выделить всё
finally
    //if Assigned(FindJsonData) then
      //FindJsonData.Free;
    FreeAndNil(JsonData);
    FreeAndNil(serverDate);
  end;         

при освобождении ресурсов, если попытаться освободить FindJsonData вываливается ошибка
Проект Daemon application вызвал класс исключения 'External: Unknown exception code 6'.
По адресу 7C64588EAFFF

если закоментарить - все работает.
Хотелось бы понять - как правильно освободить ресурс?
GreyCrazyWolf
незнакомец
 
Сообщения: 9
Зарегистрирован: 02.03.2023 15:23:57

Re: Как правильно освобождать ресурсы TJSONData

Сообщение iskander » 29.02.2024 10:44:06

Емнип, подобный вопрос уже задавался, возможно даже неоднократно.
Распарсенный документ JSON в исполнении FpJson(да и в других обычно тоже) представляет собой корневое дерево, в котором каждый узел отвечает за очистку памяти своих дочерних узлов. Соответственно, чтобы освободить память всего документа, достаточно вызвать Free для корневого узла (JsonData). А вызов FindJsonData.Free вызовет ошибку двойного освобождения памяти.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Как правильно освобождать ресурсы TJSONData

Сообщение GreyCrazyWolf » 29.02.2024 12:03:43

iskander писал(а):Емнип, подобный вопрос уже задавался, возможно даже неоднократно.

Прошу прощения, поиском по FpJson и TJSONData пробежался, но тему Правильная очистка памяти при работе с JSON не заметил :oops:
Спасибо.
GreyCrazyWolf
незнакомец
 
Сообщения: 9
Зарегистрирован: 02.03.2023 15:23:57


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 73

Рейтинг@Mail.ru