powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FreeAndNil Dataset
22 сообщений из 47, страница 2 из 2
FreeAndNil Dataset
    #40031478
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Код: 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.
procedure TForm1.Button7Click(Sender: TObject);   
var
  OtvJSAr, OtvJSArNotDuble: TJSonArray;
begin
  OtvJSAr := TJSonArray.Create;
  OtvJSArNotDuble := TJSonArray.Create;
 try
  OtvJSAr := TJsonObject.ParseJSONValue(mmo2.text) as TJsonArray;
     if Assigned (OtvJSAr) then begin
          edt6.Text := inttostr(OtvJSAr.Count);
     end
     else  ShowMessage ('не понял структуру данных');

     mmo2.Lines.Clear;
     OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);
     mmo2.Lines.Add (OtvJSArNotDuble.Format(2));

 finally

  FreeAndNil (OtvJSAr);
  ShowMessage ('конец2');      // для отладки
  FreeAndNil (OtvJSArNotDuble);
  ShowMessage ('конец3');      // для отладки
 end;
end;



На строке FreeAndNil (OtvJSArNotDuble); выскакивает ошибка и сообщения ShowMessage ('конец3'); я уже не получаю.
Работаю на Delphi 10.3
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031484
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mechanic17
defecator,

Код: 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.
procedure TForm1.Button7Click(Sender: TObject);   
var
  OtvJSAr, OtvJSArNotDuble: TJSonArray;
begin
  OtvJSAr := TJSonArray.Create;
  OtvJSArNotDuble := TJSonArray.Create;
 try
  OtvJSAr := TJsonObject.ParseJSONValue(mmo2.text) as TJsonArray;
     if Assigned (OtvJSAr) then begin
          edt6.Text := inttostr(OtvJSAr.Count);
     end
     else  ShowMessage ('не понял структуру данных');

     mmo2.Lines.Clear;
     OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);
     mmo2.Lines.Add (OtvJSArNotDuble.Format(2));

 finally

  FreeAndNil (OtvJSAr);
  ShowMessage ('конец2');      // для отладки
  FreeAndNil (OtvJSArNotDuble);
  ShowMessage ('конец3');      // для отладки
 end;
end;




На строке FreeAndNil (OtvJSArNotDuble); выскакивает ошибка и сообщения ShowMessage ('конец3'); я уже не получаю.
Работаю на Delphi 10.3

мнея в этом коде настораживает момент, когда ты получаешь ошибку - "не понял структуру данных",
но затем упорно что-то с этой неправильной структурой данных делаешь

в моём понимании должно быть примерно так:

Код: pascal
1.
2.
3.
4.
if Assigned (OtvJSAr) then begin
          edt6.Text := inttostr(OtvJSAr.Count);
     end
     else  begin ShowMessage ('не понял структуру данных'); Exit ; end;
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031487
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,
тут вы правы. Но т.к. проблем в if нет (т.е. все хорошо парсится и дальше нужный элемент перекидывается из OtvJSA в OtvJSArNotDuble и выводится в Memo) то не проработал еще эту часть в else . Теперь устранил ваше замечание.

Кстати попробовал вариант. Ошибка осталась.
Код: pascal
1.
2.
3.
4.
5.
finally
  OtvJSAr.Free;
  ShowMessage ('конец2');
  OtvJSArNotDuble.Free;
  ShowMessage ('конец3');
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031488
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mechanic17
defecator,
тут вы правы. Но т.к. проблем в if нет (т.е. все хорошо парсится и дальше нужный элемент перекидывается из OtvJSA в OtvJSArNotDuble и выводится в Memo) то не проработал еще эту часть в else .

Кстати попробовал вариант. Ошибка осталась.
Код: pascal
1.
2.
3.
4.
5.
finally
    OtvJSAr.Free;
  ShowMessage ('конец2');
      OtvJSArNotDuble.Free;
  ShowMessage ('конец3');



бред, ты уж прости
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031491
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,
Понимаю, что бред. А как правильно не понимаю...

Код: pascal
1.
2.
3.
4.
5.
 finally
  FreeAndNil (OtvJSAr);
  ShowMessage ('конец2');
//  FreeAndNil (OtvJSArNotDuble);
  ShowMessage ('конец3');


Выполняется без ошибки...
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031492
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mechanic17
defecator,
Понимаю, что бред. А как правильно не понимаю...

Код: pascal
1.
2.
3.
4.
5.
 finally
  FreeAndNil (OtvJSAr);
  ShowMessage ('конец2');
//  FreeAndNil (OtvJSArNotDuble);
  ShowMessage ('конец3');



Выполняется без ошибки...

а что там внутри try..finally ?
появилось что-то свеженького, или осталось, как и было ?
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031493
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Только это
Код: pascal
1.
2.
3.
4.
else  begin
      ShowMessage ('не понял структуру данных');
      Exit ;
 end;
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031496
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,
Если убрать строку
Код: pascal
1.
OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);

, то все хорошо завершается...
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031500
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут http://www.delphibasics.ru/FreeAndNil.php пишут:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
...
// И теперь освобождаем и обнуляем этот объект
  FreeAndNil(myList);

 // Мы можем сделать это безопасно дважды - она игнорирует нулевые объекты
  FreeAndNil(myList);
end;



Никакого исключения не произойдёт - второй FreeAndNil не ничего делает.

И это действительно так:
Код: pascal
1.
2.
3.
4.
5.
6.
 finally
  FreeAndNil (OtvJSArNotDuble);
   FreeAndNil (OtvJSArNotDuble);
  ShowMessage ('конец2');
  FreeAndNil (OtvJSAr);
  ShowMessage ('конец3');



FreeAndNil (OtvJSArNotDuble); FreeAndNil (OtvJSArNotDuble); - выполняется без проблем.
FreeAndNil (OtvJSAr); - ошибка.
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031501
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mechanic17
defecator,
Если убрать строку
Код: pascal
1.
OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);


, то все хорошо завершается...
откуда она у тебя выполнилась, если произошёл Exit ?
ты что-то не договариваешь
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031503
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,
проблем в if нет (т.е. все хорошо парсится и дальше нужный элемент перекидывается из OtvJSA в OtvJSArNotDuble и выводится в Memo)
В else не заходим!


mmo2.text НЕ пустой там уже ответ от сервера. Ведь это procedure TForm1.Button7Click - Button7 ;)
Но переменные OtvJSA и OtvJSArNotDuble существуют ТОЛЬКО в этой процедуре.
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031506
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Mechanic17
defecator,
проблем в if нет (т.е. все хорошо парсится и дальше нужный элемент перекидывается из OtvJSA в OtvJSArNotDuble и выводится в Memo)
В else не заходим!


mmo2.text НЕ пустой там уже ответ от сервера. Ведь это procedure TForm1.Button7Click - Button7 ;)

дебаг тоже не работает ?
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031510
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mechanic17
Если убрать строку
Код: pascal
1.
OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);


, то все хорошо завершается...

Потому что двойное удаление у тебя. Ты в массив добавляешь элемент, которым владеет другой массив.
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031511
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,
моя голова не работает... Что я там должен увидеть/не увидеть?

В такой связке ошибки нет. Но почему она вообще появляется???
Код: pascal
1.
2.
3.
4.
5.
 finally
  FreeAndNil (OtvJSArNotDuble);
  OtvJSAr := TJSonArray.Create;
  ShowMessage ('конец2');
  FreeAndNil (OtvJSAr);
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031513
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey
Mechanic17
Если убрать строку
Код: pascal
1.
OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);


, то все хорошо завершается...

Потому что двойное удаление у тебя. Ты в массив добавляешь элемент, которым владеет другой массив.


Да. И надеюсь, что этот элемент теперь существует в двух массивах, а не как указатель на элемент первого массива.
Тогда как нужно было скопировать этот элемент?
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031514
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mechanic17
Тогда как нужно было скопировать этот элемент?

Например, так:
Код: pascal
1.
arr2.AddElement(TJSONValue(arr1.Items[0].Clone));
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031535
Mechanic17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,
Спасибо.
Код: pascal
1.
OtvJSArNotDuble.Add (OtvJSAr.items[0].Clone as TJSONObject);


Ваша рекомендация снимает ошибку.

Но в чем был конфликт? Пусть даже OtvJSArNotDuble хранит лишь указатель на один из элементов OtvJSAr. И когда удалил OtvJSArNotDuble остальные элементы OtvJSAr ведь еще существуют.
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031542
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mechanic17,

JSONArray при удалении, удаляет содержащиеся в нём элементы. В твоём случае, два массива имеют ссылку на один и тот же объект. Соответственно, когда один из массивов удаляет объект по ссылке, второй массив ссылается на уже удалённый объект. При попытке удалить объект второй раз и возникает ошибка.
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031543
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно OtvJSArNotDuble был добавлен в OtvJSAr, и OtvJSAr владеет и уничтожает OtvJSArNotDuble при своем уничтожении.
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031544
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не увидел вторую страницу :)
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031638
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);
FreeAndNil (OtvJSAr);
FreeAndNil (OtvJSArNotDuble);


Предположительно, FreeAndNil (OtvJSArNotDuble) уничтожает все внутренние итемы, которые были уже уничтожены предыдущей строкой
...
Рейтинг: 0 / 0
FreeAndNil Dataset
    #40031763
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mechanic17
Код: 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.
procedure TForm1.Button7Click(Sender: TObject);   
var
  OtvJSAr, OtvJSArNotDuble: TJSonArray;
begin
  OtvJSAr := TJSonArray.Create;  // Создали объект
  OtvJSArNotDuble := TJSonArray.Create;
 try
  OtvJSAr := TJsonObject.ParseJSONValue(mmo2.text) as TJsonArray;  // переписали его новым объектом
     if Assigned (OtvJSAr) then begin
          edt6.Text := inttostr(OtvJSAr.Count);
     end
     else  ShowMessage ('не понял структуру данных');

     mmo2.Lines.Clear;
     OtvJSArNotDuble.Add (OtvJSAr.items[0] as TJSONObject);  // Теперь у объекта два владельца OtvJSAr.items[0] 
     mmo2.Lines.Add (OtvJSArNotDuble.Format(2));

 finally

  FreeAndNil (OtvJSAr);
  ShowMessage ('конец2');      // для отладки
  FreeAndNil (OtvJSArNotDuble);
  ShowMessage ('конец3');      // для отладки
 end;
end;

...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FreeAndNil Dataset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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