Все просто.Игорь Столяров писал(а): ↑26 Октябрь 2018, 16:08А напрасно ! Прелюбопытнейший прибамбас, доложу я Вам …
Зацикливаем, например вот такой код и смотрим через диспетчер задач, как приложение медленно,
но верно начинает поджирать память:
Убираем комментарий и всё приходит в норму - расход памяти на уровне погрешности наблюдения (плюс / минус)…Код: Выделить всё
Loop ... MySlip &= NewDynStr() MySlip.Cat('Какой-то длинный предлинный текст') !!! MySlip.Kill DisposeDynStr(MySlip) end
Почему оно всё так сделано ? Это вопрос грустной философии Clarion …
IDynStr - это интерфейс, а не класс. Т.е. он содержит только методы, а свойств не содержит.
Т.к. это не класс, то у него нет ни конструктора, ни деструктора, которые бы запускались при создании и удалении объекта.
Но где-то внутри есть, по крайней мере одна, переменная, которая содержит адрес динамической строки.
При вызове DisposeDynStr(MySlip) освобождается только память выделенная под этот объект, но не происходит освобождения памяти переменных выделенных при работе класса. Поэтому память выделенная под строку не освобождается.
Самым лучшим выходом мне видится написание класса, наследованного от данного интерфейса, в деструкторе которого нужно вызвать метод Kill, тогда при вызове Dispose для объекта этого класса будет автоматически запускаться деструктор.
А еще лучше объявлять не ссылку на класс, а класс. Тогда, при выходе из процедуры, будет автоматически запускаться деструктор и не будет необходимости помнить об освобождении памяти выделенных в классе, а также и памяти выделенной под сам класс.