Страница 1 из 2
Эти странные динамические строки
Добавлено: 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
Что я делаю не так ? Почему при освобождении памяти указатель на строку всё равно существует ?
Заранее спасибо ...
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 10:00
Admin
Из за этой хрени я не пользуюсь для IDynStr проверкой на NULL а просто стараюсь четко соблюдать последовательность.
Если за DisposeDynStr(Loc:Buffer) добавить DISPOSE(Loc:Buffer) переменная обнулится. Но не думаю что это правильно
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 10:05
Игорь Столяров
Admin писал(а): ↑25 Октябрь 2018, 10:00добавить DISPOSE(Loc:Buffer)
Явно применять Dispose() опасно даже для несуществующего указателя на простой тип данных …
Здесь скорее надо заменить:
на
Код: Выделить всё
DisposeDynStr(Loc:Buffer)
Loc:Buffer &= NULL
Но как-то это странно и непонятно. Совсем.
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 11:47
Yufil
А кто сказал, что при ликвидации объекта должна очищаться ссылка на него? Нет никакой возможности определить, где эта ссылка хранится и нет ли других ссылок на тот же самый объект.
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 12:04
Игорь Столяров
Yufil писал(а): ↑25 Октябрь 2018, 11:47где эта ссылка хранится и нет ли других ссылок на тот же самый объект.
Да, но с простыми типами данных это работает именно так …
Например несколько указателей может указывать на одну строку (String).
При применении Dispose() к любому из указателей, все остальные можно проверить на NULL и не нарываться на проблемы.
А здесь другое … DisposeDynStr() оставляет "живым" указатель и любое обращение к нему заканчивается крахом.
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 13:17
Yufil
У меня когда-то не срослось с DynStr/Any, падало на Prop:Use, неожиданные проблемы с Evaluate и т.д. пришлось свой класс писать. Наверное, не разобрался как следует. Как в анекдоте - ложечки нашлись, но осадок остался
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 13:27
Игорь Столяров
Ну написать свой класс работы с безразмерными строками не проблема.
У меня тоже есть загрузка в строку по HTTP файла неведомого размера.
А с IDynStr вроде как всё готово и встроено - грех не пользоваться. Однако есть нюансы.
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 13:50
Дед Пахом
Игорь Столяров писал(а): ↑25 Октябрь 2018, 9:40Почему при освобождении памяти указатель на строку всё равно существует ?
Указатель, положим, не на строку. И где в документации написано, что DisposeDynStr должен что-то обнулять?
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 15:56
vic7tar
С DynStr не имел дела, но напрашивается вопрос - а почему не сделано как с обычным Dispose -> одновременно освобождается память и обнуляется указатель?
Эти странные динамические строки
Добавлено: 25 Октябрь 2018, 16:21
Игорь Столяров
Дед Пахом писал(а): ↑25 Октябрь 2018, 13:50что DisposeDynStr должен что-то обнулять
Ну как бы DisposeDynStr() освобождает память занимаемую структурой IDynStr, на которую указывает указатель.
После этого любые обращения по указателю - ошибочны (точнее даже катастрофичны).
Вполне логично ожидать, что это будет как-то обозначено, например установкой самого указателя в NULL (по аналогии с Dispose()).
Иначе просто невозможно проверить в каком состоянии структура IDynStr и можно ли к ней обращаться ...
Эти странные динамические строки
Добавлено: 26 Октябрь 2018, 16:08
Игорь Столяров
vic7tar писал(а): ↑25 Октябрь 2018, 15:56С DynStr не имел дела, но напрашивается вопрос
А напрасно ! Прелюбопытнейший прибамбас, доложу я Вам …
Зацикливаем, например вот такой код и смотрим через диспетчер задач, как приложение медленно,
но верно начинает поджирать память:
Код: Выделить всё
Loop ...
MySlip &= NewDynStr()
MySlip.Cat('Какой-то длинный предлинный текст')
!!! MySlip.Kill
DisposeDynStr(MySlip)
end
Убираем комментарий и всё приходит в норму - расход памяти на уровне погрешности наблюдения (плюс / минус)…
Почему оно всё так сделано ? Это вопрос грустной философии Clarion …
Эти странные динамические строки
Добавлено: 26 Октябрь 2018, 16:13
Дед Пахом
Игорь Столяров писал(а): ↑26 Октябрь 2018, 16:08Убираем комментарий и всё приходит в норму
Вот за это спасибо, пойду везде Kill поставлю (интересно, Trunc(0) тот же эффект даёт?).
Эти странные динамические строки
Добавлено: 26 Октябрь 2018, 16:17
Игорь Столяров
Дед Пахом писал(а): ↑26 Октябрь 2018, 16:13(интересно, Trunc(0) тот же эффект даёт?).
Кто же его знает как оно работает … Это же не LibSrc, а где-то в недрах RTL всё происходит …
Нам дано лишь наблюдать данный феномен посредством эксперимента …
Могу предположить, что Kill() и Trunc(0) просто сводятся к записи Chr(0) в первую позицию строки.
Эти странные динамические строки
Добавлено: 26 Октябрь 2018, 17:56
vic7tar
Игорь Столяров писал(а): ↑26 Октябрь 2018, 16:08А напрасно ! Прелюбопытнейший прибамбас, доложу я Вам …
Не спасибо за рекламу - обойдусь.
Ну поставили Kill, ну обнулили строку, а как это связано с началом поста?
Эти странные динамические строки
Добавлено: 26 Октябрь 2018, 18:17
Игорь Столяров
vic7tar писал(а): ↑26 Октябрь 2018, 17:56а как это связано с началом поста
Никак не связано. Время идёт, вопросы решаются, проблемы меняются и т.д.
А вот с темой данной группы сообщений связано самым непосредственным образом.
Зачем плодить разделы, если сказка-то одна и та же ?
Кстати, то что метод ОЧИСТКИ строки называется IDynStr.Kill() косвенно свидетельствует, что либо сам IDynStr
появился намного раньше классов ABC, либо то, что его делал программер не знакомый с именами классов в ABC.