Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2019, 13:11   #1
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию Когда нужно память освобождать ?

Всем привет, часто сталкиваюсь при работе с JSON с такой проблемой

Код:
Procedure AddAuthorizeLog (stat,text: string);
var
  JSObj: TJSONObject;
begin
  try
    JSObj:=TJSONObject.Create as TJSONObject;
    JSObj.AddPair('stat',TJSONString.Create(stat));
    JSObj.AddPair('data',TJSONString.Create(DateTimeToStr(now)));
    JSObj.AddPair('text',TJSONString.Create(text));
    AuthorizLogArry.AddElement( JSObj );
  finally
   //  FreeAndNil(JSObj);
  end;


end;
Если раскоментировать FreeAndNil(JSObj); программа крашится при обращении к AuthorizLogArry. Без освобождения все работает.

В моем понимании, если есть create должны и освободить по завершении операции. Или это не так?
niockasd вне форума Ответить с цитированием
Старый 22.06.2019, 13:23   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Ну вы то операцию не завершили. Вы только отдали объект кому-то попользоваться. Читайте доки очищает ли AuthorizLogArry свои элементы сам или потом вам надо чистить.
p51x вне форума Ответить с цитированием
Старый 22.06.2019, 13:45   #3
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну вы то операцию не завершили. Вы только отдали объект кому-то попользоваться. Читайте доки очищает ли AuthorizLogArry свои элементы сам или потом вам надо чистить.
AuthorizLogArry - это переменная глобальная JSONArry. При создании формы инициируется и при дестройте освабождается...
Какая разница JSObj что дальше будет с отданой информацией )?
niockasd вне форума Ответить с цитированием
Старый 22.06.2019, 14:01   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от niockasd Посмотреть сообщение
Какая разница JSObj что дальше будет с отданой информацией )?
Никакой. Но вы ведь сам объект отдаете в пользование.
p51x вне форума Ответить с цитированием
Старый 22.06.2019, 14:01   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Практика такая где выделили там и освобождаем. Иногда это тело в функции. Но иногда объекты живут дольше и это уже не тело функции, а тело класса или даже весь юнит. Класс TMyClass1 создал объект он его и уничтожает. Или ваш Юнит.
Это не строгие правила, а правила хорошего тона. Известные как RAII. Но оно спасает от многих ошибок.

У вашей библиотеке JSON кривая архитектура.
Цитата:
Сообщение от niockasd Посмотреть сообщение
AuthorizLogArry - это переменная глобальная JSONArry. При создании формы инициируется и при дестройте освабождается...
Какая разница JSObj что дальше будет с отданой информацией )?
Так не информация передаётся, а лишь ссылка(JSObj). А вы память освобождаете.
Разумеется когда AuthorizLogArry захочет обратиться к JSObj он по пробует перейти по ссылке он попадает в молоко. Так как данные вы уже освободили во finally.

Поэтому в вашем случае вы должны освобождать память когда он вам будет не нужен в AuthorizLogArry. Тогда вы его изъимите из AuthorizLogArry, а так же перед удалением AuthorizLogArry.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 22.06.2019, 14:31   #6
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Практика такая где выделили там и освобождаем. Иногда это тело в функции. Но иногда объекты живут дольше и это уже не тело функции, а тело класса или даже весь юнит. Класс TMyClass1 создал объект он его и уничтожает. Или ваш Юнит.
Это не строгие правила, а правила хорошего тона. Известные как RAII. Но оно спасает от многих ошибок.

У вашей библиотеке JSON кривая архитектура.

Так не информация передаётся, а лишь ссылка(JSObj). А вы память освобождаете.
Разумеется когда AuthorizLogArry захочет обратиться к JSObj он по пробует перейти по ссылке он попадает в молоко. Так как данные вы уже освободили во finally.

Поэтому в вашем случае вы должны освобождать память когда он вам будет не нужен в AuthorizLogArry. Тогда вы его изъимите из AuthorizLogArry, а так же перед удалением AuthorizLogArry.
неожиданно, печально.
Я хотел сделать что то типа записи логов в массив JSON, в моем случае код приведенный выше работает, могут ли возникнуть какие то проблемы в дальнейшем?

Получается при каждой новой записи данных в лог вызывается
Код:
 JSObj:=TJSONObject.Create as TJSONObject;
старые ссылки которые отправлены ранее в AuthorizLogArry получается должны уничтожится? Почему это тогда работает?

Последний раз редактировалось niockasd; 22.06.2019 в 14:33.
niockasd вне форума Ответить с цитированием
Старый 22.06.2019, 14:57   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от niockasd Посмотреть сообщение
старые ссылки которые отправлены ранее в AuthorizLogArry получается должны уничтожится?
С чего вдруг? У вас есть полка с книгами, вы ставите новую. Все остальные на этой полке уничтожаются?

Цитата:
Сообщение от niockasd Посмотреть сообщение
Почему это тогда работает?
А почему не должно?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно ли освобождать память в деструкторе? Des80 Общие вопросы Delphi 10 06.09.2016 13:21
Когда нужно использовать ООП? leklerk Общие вопросы по программированию, компьютерный форум 49 01.06.2012 09:09
Когда нужно присваивать.. Writeln(Sum:8:4) ? Erlotaza Общие вопросы Delphi 1 09.03.2012 11:25
masm32 подменяет JZ на JE тогда, когда это совсем не нужно notHaker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 12.07.2011 17:57
Освобождать динамические процедуры. Alex Cones Общие вопросы Delphi 4 28.01.2010 17:30