Эти странные динамические строки

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 25 Октябрь 2018, 9:40

Привет всем !

Поясните пожалуйста, или я чего-то не понимаю, или оно совсем не того … :( Пример:

Код: Выделить всё

Loc:Buffer  &IDynStr

  Code
 
   Loc:Buffer &= NewDynStr()
   If ~(Loc:Buffer &= Null)
      Loc:Buffer.Cat('Привет ромашки !')
      Message(Loc:Buffer.Str())
      DisposeDynStr(Loc:Buffer)
   end
 
   ! А теперь самое интересное
   If ~(Loc:Buffer &= Null)
      Message('Указатель на динамическую строку всё равно существует ?!') 
      DisposeDynStr(Loc:Buffer)  ! И ВЫЛЕТ ИЗ ПРОГРАММЫ (ИНОГДА МОЛЧА, ИНОГДА С GPF)
   end
Что я делаю не так ? Почему при освобождении памяти указатель на строку всё равно существует ?
Заранее спасибо ...
«V» значит Вендетта !

Аватара пользователя
Admin
Администратор
Сообщения: 3378
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Эти странные динамические строки

Сообщение Admin » 25 Октябрь 2018, 10:00

Из за этой хрени я не пользуюсь для IDynStr проверкой на NULL а просто стараюсь четко соблюдать последовательность.
Если за DisposeDynStr(Loc:Buffer) добавить DISPOSE(Loc:Buffer) переменная обнулится. Но не думаю что это правильно :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 25 Октябрь 2018, 10:05

Admin писал(а):
25 Октябрь 2018, 10:00
добавить DISPOSE(Loc:Buffer)
Явно применять Dispose() опасно даже для несуществующего указателя на простой тип данных …
Здесь скорее надо заменить:

Код: Выделить всё

  DisposeDynStr(Loc:Buffer)
на

Код: Выделить всё

  DisposeDynStr(Loc:Buffer)
  Loc:Buffer &= NULL
Но как-то это странно и непонятно. Совсем. :(
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1105
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Эти странные динамические строки

Сообщение Yufil » 25 Октябрь 2018, 11:47

А кто сказал, что при ликвидации объекта должна очищаться ссылка на него? Нет никакой возможности определить, где эта ссылка хранится и нет ли других ссылок на тот же самый объект.

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 25 Октябрь 2018, 12:04

Yufil писал(а):
25 Октябрь 2018, 11:47
где эта ссылка хранится и нет ли других ссылок на тот же самый объект.
Да, но с простыми типами данных это работает именно так …
Например несколько указателей может указывать на одну строку (String).
При применении Dispose() к любому из указателей, все остальные можно проверить на NULL и не нарываться на проблемы.
А здесь другое … DisposeDynStr() оставляет "живым" указатель и любое обращение к нему заканчивается крахом. :(
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1105
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Эти странные динамические строки

Сообщение Yufil » 25 Октябрь 2018, 13:17

У меня когда-то не срослось с DynStr/Any, падало на Prop:Use, неожиданные проблемы с Evaluate и т.д. пришлось свой класс писать. Наверное, не разобрался как следует. Как в анекдоте - ложечки нашлись, но осадок остался :)

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 25 Октябрь 2018, 13:27

Ну написать свой класс работы с безразмерными строками не проблема. :)
У меня тоже есть загрузка в строку по HTTP файла неведомого размера.
А с IDynStr вроде как всё готово и встроено - грех не пользоваться. Однако есть нюансы. :)
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2244
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Эти странные динамические строки

Сообщение Дед Пахом » 25 Октябрь 2018, 13:50

Игорь Столяров писал(а):
25 Октябрь 2018, 9:40
Почему при освобождении памяти указатель на строку всё равно существует ?
Указатель, положим, не на строку. И где в документации написано, что DisposeDynStr должен что-то обнулять?
С уважением, ДП

Аватара пользователя
vic7tar
Активист
Сообщения: 187
Зарегистрирован: 09 Февраль 2017, 20:12

Эти странные динамические строки

Сообщение vic7tar » 25 Октябрь 2018, 15:56

С DynStr не имел дела, но напрашивается вопрос - а почему не сделано как с обычным Dispose -> одновременно освобождается память и обнуляется указатель?
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 25 Октябрь 2018, 16:21

Дед Пахом писал(а):
25 Октябрь 2018, 13:50
что DisposeDynStr должен что-то обнулять
Ну как бы DisposeDynStr() освобождает память занимаемую структурой IDynStr, на которую указывает указатель.
После этого любые обращения по указателю - ошибочны (точнее даже катастрофичны).
Вполне логично ожидать, что это будет как-то обозначено, например установкой самого указателя в NULL (по аналогии с Dispose()).
Иначе просто невозможно проверить в каком состоянии структура IDynStr и можно ли к ней обращаться ...
«V» значит Вендетта !

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 26 Октябрь 2018, 16:08

vic7tar писал(а):
25 Октябрь 2018, 15:56
С DynStr не имел дела, но напрашивается вопрос
А напрасно ! Прелюбопытнейший прибамбас, доложу я Вам … :)

Зацикливаем, например вот такой код и смотрим через диспетчер задач, как приложение медленно,
но верно начинает поджирать память:

Код: Выделить всё


  Loop ...
     MySlip &= NewDynStr()
     MySlip.Cat('Какой-то длинный предлинный текст')
     !!! MySlip.Kill
     DisposeDynStr(MySlip)
  end
  
Убираем комментарий и всё приходит в норму - расход памяти на уровне погрешности наблюдения (плюс / минус)…
Почему оно всё так сделано ? Это вопрос грустной философии Clarion … ;)
Последний раз редактировалось Игорь Столяров 26 Октябрь 2018, 16:14, всего редактировалось 1 раз.
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2244
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Эти странные динамические строки

Сообщение Дед Пахом » 26 Октябрь 2018, 16:13

Игорь Столяров писал(а):
26 Октябрь 2018, 16:08
Убираем комментарий и всё приходит в норму
Вот за это спасибо, пойду везде Kill поставлю (интересно, Trunc(0) тот же эффект даёт?).
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 26 Октябрь 2018, 16:17

Дед Пахом писал(а):
26 Октябрь 2018, 16:13
(интересно, Trunc(0) тот же эффект даёт?).
Кто же его знает как оно работает … Это же не LibSrc, а где-то в недрах RTL всё происходит …
Нам дано лишь наблюдать данный феномен посредством эксперимента … ;)
Могу предположить, что Kill() и Trunc(0) просто сводятся к записи Chr(0) в первую позицию строки.
«V» значит Вендетта !

Аватара пользователя
vic7tar
Активист
Сообщения: 187
Зарегистрирован: 09 Февраль 2017, 20:12

Эти странные динамические строки

Сообщение vic7tar » 26 Октябрь 2018, 17:56

Игорь Столяров писал(а):
26 Октябрь 2018, 16:08
А напрасно ! Прелюбопытнейший прибамбас, доложу я Вам … :)
Не спасибо за рекламу - обойдусь.
Ну поставили Kill, ну обнулили строку, а как это связано с началом поста?
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4003
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

Эти странные динамические строки

Сообщение Игорь Столяров » 26 Октябрь 2018, 18:17

vic7tar писал(а):
26 Октябрь 2018, 17:56
а как это связано с началом поста
Никак не связано. Время идёт, вопросы решаются, проблемы меняются и т.д.
А вот с темой данной группы сообщений связано самым непосредственным образом.
Зачем плодить разделы, если сказка-то одна и та же ? :)

Кстати, то что метод ОЧИСТКИ строки называется IDynStr.Kill() косвенно свидетельствует, что либо сам IDynStr
появился намного раньше классов ABC, либо то, что его делал программер не знакомый с именами классов в ABC. ;)
«V» значит Вендетта !

Ответить