Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JSONArray.Owned / 3 сообщений из 3, страница 1 из 1
11.08.2021, 15:26
    #40090086
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSONArray.Owned
Здравствуйте.
С сайта получаю информацию по заказу со списком продуктов.
Есть тестовый код (см. ниже), который работает без ошибок и утечек памяти.
В этом примере все работает. Но если переношу этот код в проект, то при "JSON.Free" получаю AV.
Методом "тыка" выяснил, что ошибка возникает из-за "JSONArray.Free".
Если закомментировать строки
JSONArray.Owned := False;
JSONArray.Free;
То ошибки нет и утечки памяти нет.
Вопрос 1. Почему нет утечки памяти, при комментировании этих двух строк?
Есть предположение, что объект JSONArray "волшебным" образом (неявно) уничтожается при уничтожении JSON. Свойство Owned я до конца не понял. Думал, что речь идет о тексте, а не об объектах. Если об объектах, то как JSON узнает о JSONArray?
Вопрос 2. Если предположить, что этот тестовый код я корректно перенес в проект, то возможно есть ошибка в реализации json в delphi? Я понимаю, что вам нужно посмотреть этот код, но может быть кто-то сталкивался с подобными проблемами?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
procedure TForm1.btGetClick(Sender: TObject);
var
  Result: string;
  PostData: TIdMultiPartFormDataStream;
  JSON: TJSONObject;
  JSONArray: TJSONArray;
  I: Integer;
begin
  PostData := TIdMultiPartFormDataStream.Create;
  PostData.AddFormField('key', Key);
  PostData.AddFormField('target', 'order');
  PostData.AddFormField('trigger', 'GET');
  Result := IdHTTP.Post(URL, PostData);
  PostData.Free;
  mmResult.Lines.Add(Result);
  JSON := TJSONObject.ParseJSONValue(Result) as TJSONObject;
  if Assigned(JSON) then
    try
      mmResult.Lines.Add(JSON.Values['orgname'].Value);
      JSONArray := JSON.Values['products'].AsType<TJSONArray>;
      if Assigned(JSONArray) then
      try
        JSONArray.Owned := False;
        for I := 0 to Pred(JSONArray.Count) do
          mmResult.Lines.Add(JSONArray.Items[I].AsType<TJSONObject>.Values['name'].Value);
      finally
        JSONArray.Free;
      end;
    finally
      JSON.Free;
    end;
end;
...
Рейтинг: 0 / 0
12.08.2021, 19:44
    #40090407
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSONArray.Owned
shmelina
Есть тестовый код (см. ниже), который работает без ошибок
Случайность
shmelina
Вопрос 1. Почему нет утечки памяти, при комментировании этих двух строк?
Потому что родительский объект сам уничтожает своих детей
shmelina
Свойство Owned я до конца не понял
Оно показывает, нужно ли родителю уничтожать ребенка
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
destructor TJSONObject.Destroy;
var
  Member: TJSONAncestor;
  I: Integer;
begin
  for i := 0 to FMembers.Count - 1 do
  begin
    Member := FMembers.List[I];
    if Member.Owned then
      Member.Free;
  end;
  FreeAndNil(FMembers);
  inherited Destroy;
end;

По умолчанию True. Но если вы уничтожаете массив вручную, до уничтожения родителя, то на выделенной строке будет происходить обращение к уже уничтоженному объекту
shmelina
возможно есть ошибка в реализации json в delphi?
Нет. Случайная работа с памятью. Подключите FastMM и получите стабильную ошибку
...
Рейтинг: 0 / 0
13.08.2021, 11:06
    #40090495
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSONArray.Owned
_Vasilisk_
то на выделенной строке будет происходить обращение к уже уничтоженному объекту
Понял, спасибо.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JSONArray.Owned / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]