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

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

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

Ответить
GreyCrazyWolf
новенький
Сообщения: 12
Зарегистрирован: 02.03.2023 14:23:57

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

Сообщение GreyCrazyWolf »

Добрейшего времени суток.
Хотелось бы уточнить как правильно освобождать ресурсы при работе с 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
если закоментарить - все работает.
Хотелось бы понять - как правильно освободить ресурс?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Емнип, подобный вопрос уже задавался, возможно даже неоднократно.
Распарсенный документ JSON в исполнении FpJson(да и в других обычно тоже) представляет собой корневое дерево, в котором каждый узел отвечает за очистку памяти своих дочерних узлов. Соответственно, чтобы освободить память всего документа, достаточно вызвать Free для корневого узла (JsonData). А вызов FindJsonData.Free вызовет ошибку двойного освобождения памяти.
GreyCrazyWolf
новенький
Сообщения: 12
Зарегистрирован: 02.03.2023 14:23:57

Сообщение GreyCrazyWolf »

iskander писал(а):Емнип, подобный вопрос уже задавался, возможно даже неоднократно.
Прошу прощения, поиском по FpJson и TJSONData пробежался, но тему Правильная очистка памяти при работе с JSON не заметил :oops:
Спасибо.
Ответить