Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
function GetJSONForData(SearchType: TSearchType; id_key: integer): string;
 Var
  JSONObject, innerObject: TJSONObject;
begin
// создать JSON для
  jsonObject :=  TJSONObject.Create;
  innerObject := TJSONObject.Create;

  try
    innerObject.AddPair(...);
    innerObject.AddPair(...);
    jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject));

    result := jsonObject.ToJSON;
  finally
    innerObject.DisposeOf;
    jsonObject.DisposeOf;// исключение здесь
  end;// finally
end;


Создаю два TJSONObject, потом удаляю их. Но почему-то при уничтожении второго - ошибка Invalid pointer operation. Получается, что jsonObject сам уничтожается?

И вижу в примерах, что TJSONPair создаются, но не уничтожаются.
10 май 19, 11:14    [21882056]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
ёёёёё
Member

Откуда:
Сообщений: 162
X11,

не умничай, ты же дельфист: используй [x]superobject.
10 май 19, 23:09    [21882304]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1359
Если класс унаследован от TJSONAncestor, по умолчанию Owned = True, а это значит что при уничтожении контейнера, будут уничтожены все его элементы. Потому что связь сильная между контейнером и элементами.
Если надо добавить элемент по слабой связи (например вы хотите этот элемент содержать в нескольких контейнерах, а потом самим разрушить), то делается так:
innerObject.Owned := False;
jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject));
10 май 19, 23:41    [21882313]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
ёёёёё
используй [x]superobject.

Не хочу
12 май 19, 10:50    [21882676]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
X-Cite, спасибо
12 май 19, 10:51    [21882677]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
Cobalt747
Member

Откуда:
Сообщений: 2085
Но лучше, конечно, 5 звездочек!
jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject.Clone));
13 май 19, 20:45    [21883788]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Cobalt747, не понял намёка.
14 май 19, 08:24    [21883992]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
Василий 2
Member

Откуда:
Сообщений: 521
X11
Cobalt747, не понял намёка.

Намек в том, что не стоит один и тот же куст пихать в два контейнера, лучше клонировать
14 май 19, 10:22    [21884105]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
А потом отдельно уничтожать innerObject?
А почему не стоит?
14 май 19, 10:27    [21884110]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
Василий 2
Member

Откуда:
Сообщений: 521
Вообще конкретно с этим классом json я не работал, но принцип разумности и ожидаемости предполагает, что контейнер сам заботится об удалении всех своих элементов. соответственно удалять элемент отдельно не нужно, вставил и забыл.

А не стоит потому, что незачем зазря усложнять структуру данных. Элемент принадлежит одному контейнеру, но засунут в еще три других по ссылке, потом контейнер-владелец удаляется, получаем AV или битую память... оно тебе надо?
14 май 19, 10:56    [21884145]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Спасибо.
Я просто ни разу нигде не видел в примерах, чтобы кто-то использовал Clone
14 май 19, 11:14    [21884178]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Cobalt747
Но лучше, конечно, 5 звездочек!
jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject.Clone));



      JSONObject  := TJSONObject.Create;
      innerObject := TJSONObject.Create;
      try
        innerObject.AddPair(TJSONPair.Create(constTagID, SearchVal));
        JSONObject.AddPair(TJSONPair.Create(constTagSearchType, ORD(SearchType).ToString));
        JSONObject.AddPair(TJSONPair.Create('innerObject', innerObject.Clone));


Ошибка при компиляции: There is no overloaded version of 'Create' that can be called with these arguments
14 май 19, 16:18    [21884587]     Ответить | Цитировать Сообщить модератору
 Re: Уничтожение TJSONObject  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
так правильно
JSONObject.AddPair(TJSONPair.Create('innerObject', TJSONObject(innerObject.Clone)));
14 май 19, 16:21    [21884589]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить