Помощь - Поиск - Пользователи - Календарь
Полная версия: Колекции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Bokul
Как правильно уничтожить экземпляр PStringCollection, каждый элемент которого есть указателем на строку (создаётся с помощью newstr)?
klem4
Это в каком из 16б паскалей такое есть ? blink.gif
volvo
В Турбо Паскале есть... TurboVision вообще на коллекциях построен...

Bokul,
Dispose(my_collection_ptr, Done);

Все содержимое удаляет сам деструктор...
Bokul
Спасибо.
А как быть с TCollection? Также само просто вызвать деструктор или же сначала надо пробежаться по коллекции, чтобы "вручную" вернуть занятую ее элементами память назад в кучу, и только потом уничтожать сам экземпляр TCollection?
volvo
Переопредели FreeItem так, чтобы он мог удалить айтемы твоего типа (если они - НЕ наследники TObject). Вот что об этом говорится в Help-е:
Цитата(TP Help)
TCollection.FreeItem method:
Descendant collection objects that don't use descendants of TObject as their items, such as string collections, must override FreeItem to dispose of the given Item.
Bokul
Цитата
such as string collections

Так я не понял для коллекции строк надо переопределять FreeItem или нет?
Вот исходник этого метода:

procedure TStringCollection.FreeItem(Item: Pointer);
begin
DisposeStr(Item);
end;


Он же вроде сам все что нужно делает...
volvo
А я не понял, о чем ты спрашиваешь... Выше был вопрос о TCollection... Это - абстрактная коллекция, элементы которой удаляются самостоятельно ТОЛЬКО тогда, когда они - наследники TObject... Теперь ты вдруг говоришь о TStringCollection, которая в принципе предназначена для работы со строками, было бы странно, если бы она эти строки не удаляла сама...
Bokul
Цитата
TStringCollection, которая в принципе предназначена для работы со строками, было бы странно, если бы она эти строки не удаляла сама...

Ну да, я так и думал. Меня запутала цитата из справки, которою ты привел - such as string collections , я думал тут имеется ввиду TStringCollection...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.