![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
Здравствуйте.
Задумался вот над какой проблемой. Создаю безразмерный массив из записей. Возникает необходимость удалить последний. Уменьшение размера массива на 1, как я вычитывал, не убирает последний элемент из памяти. Приравняв к нулю всё, хранящееся в записи, саму запись я же этим не уничтожу, наверное? Как избавиться от ненужной записи в массиве? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
что-то вы странное рассказываете.
покажите свой код объявления переменных/данных и код заполнения массива. после этого будет повод для предметного разговора. |
![]() |
![]() |
![]() |
#3 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]() Цитата:
To truncate a dynamic array, pass it to SetLength, Вот если у вас были не записи, а указателе или классы то их возможно надо было бы освободить вручную до того как изменять размер массива.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Ну в общем то если в записях не простые типы данных, а указатели, то их тоже нужно освобождать перед SetLength и обязательно, а не возможно, иначе утечки. А сами записи SetLength освободит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#5 |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,926
|
![]()
Если при добавлении нового элемента массива выделялась память под его внутренние данные, то при удалении этого элемента из массива естественно эту память нужно освободить. Самому, ручками.
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
Всем большое спасибо за пояснения!
![]() |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Проще использовать готовые коллекции вместо своих велосипедов с массивами.
TObjectList, TList, ... Generic (TObjectList<TMyClass>) если 2009+
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
![]()
Хм... TList, вроде, подошёл бы. Но я программирую только для своих мелких "бытовых" нужд и практически не сталкивался с необходимостью объектов или чего-то ещё, для чего необходимо "Create". И как-то побаиваюсь его... Особенно, если он соседствует с указателями. Единственное, где я использую "Create" - это TStringList, т.к. он мной используется очень часто и является очень простым в создании. Ничего кроме "Create" ему не нужно, и всё, что нужно запомнить - это что в конце его нужно удалить через Free.
Может, есть что-то понятное и полезное для того, кто не сталкивался с применением конструкторов, на русском по работе с TList? Даже в delphibasics какая-то перегрузка в примере с классами и конструкторами в примере. |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
![]()
Да, в Дельфи неудобно с Free, в С++ хотя бы есть smart-указатели или просто разрушение объектов на стеке (без new) при выходе из области видимости )
А про указатели, если 2009+, то в TList вроде уже не надо с ними париться для просто чисел и т.п. http://docwiki.embarcadero.com/CodeE...TList_(Delphi) Для классов и записей вроде в любом случае нужны указатели если вы хотите освобождать память (проще класс, тогда просто Create и Free). TObjectList умеет сам вызывать Free при удалении элемента (если стоит флаг об этом). http://docs.embarcadero.com/products...bjectList.html До 2009 все так же, только без дженериков и надо кастовать к нужному типу при доступе Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 04.04.2017 в 12:22. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
С,С++, как удалить элемент списка? | Алексей_2012 | Помощь студентам | 5 | 11.06.2015 10:38 |
как удалить n-ый элемент вектора? | Tiva | Помощь студентам | 1 | 09.11.2012 20:28 |
Как удалить элемент массива? | БалаШагаЛ | PHP | 1 | 28.01.2012 20:46 |
Как удалить(добавить) элемент массива? | vanek1 | Помощь студентам | 3 | 15.12.2010 22:26 |
Сложная структура записи (record+array) | Alex Cones | Общие вопросы Delphi | 20 | 20.10.2009 19:10 |