powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Уничтожение TJSONObject
13 сообщений из 13, страница 1 из 1
Уничтожение TJSONObject
    #39811825
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 создаются, но не уничтожаются.
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39811961
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

не умничай, ты же дельфист: используй [x]superobject.
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39811965
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если класс унаследован от TJSONAncestor, по умолчанию Owned = True, а это значит что при уничтожении контейнера, будут уничтожены все его элементы. Потому что связь сильная между контейнером и элементами.
Если надо добавить элемент по слабой связи (например вы хотите этот элемент содержать в нескольких контейнерах, а потом самим разрушить), то делается так:
Код: pascal
1.
2.
innerObject.Owned := False;
jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject));
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812169
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёиспользуй [x]superobject.
Не хочу
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812170
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite, спасибо
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812670
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но лучше, конечно, 5 звездочек!
Код: pascal
1.
jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject.Clone));
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812759
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747, не понял намёка.
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812826
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Cobalt747, не понял намёка.
Намек в том, что не стоит один и тот же куст пихать в два контейнера, лучше клонировать
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812830
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом отдельно уничтожать innerObject?
А почему не стоит?
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812855
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще конкретно с этим классом json я не работал, но принцип разумности и ожидаемости предполагает, что контейнер сам заботится об удалении всех своих элементов. соответственно удалять элемент отдельно не нужно, вставил и забыл.

А не стоит потому, что незачем зазря усложнять структуру данных. Элемент принадлежит одному контейнеру, но засунут в еще три других по ссылке, потом контейнер-владелец удаляется, получаем AV или битую память... оно тебе надо?
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39812873
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Я просто ни разу нигде не видел в примерах, чтобы кто-то использовал Clone
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39813110
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Но лучше, конечно, 5 звездочек!
Код: pascal
1.
jsonObject.AddPair(TJSONPair.Create('CallbackData', innerObject.Clone));




Код: pascal
1.
2.
3.
4.
5.
6.
      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
...
Рейтинг: 0 / 0
Уничтожение TJSONObject
    #39813112
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так правильно
Код: pascal
1.
JSONObject.AddPair(TJSONPair.Create('innerObject', TJSONObject(innerObject.Clone)));
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Уничтожение TJSONObject
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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