Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2017, 16:37   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Array of Record - как удалить элемент

Здравствуйте.
Задумался вот над какой проблемой. Создаю безразмерный массив из записей. Возникает необходимость удалить последний. Уменьшение размера массива на 1, как я вычитывал, не убирает последний элемент из памяти. Приравняв к нулю всё, хранящееся в записи, саму запись я же этим не уничтожу, наверное? Как избавиться от ненужной записи в массиве?
Ship_1 вне форума Ответить с цитированием
Старый 31.03.2017, 16:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

что-то вы странное рассказываете.
покажите свой код объявления переменных/данных и код заполнения массива.
после этого будет повод для предметного разговора.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.03.2017, 19:59   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Уменьшение размера массива на 1, как я вычитывал, не убирает последний элемент из памяти.
Ошибаетесь убирает.
To truncate a dynamic array, pass it to SetLength,

Вот если у вас были не записи, а указателе или классы то их возможно надо было бы освободить вручную до того как изменять размер массива.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 31.03.2017, 20:09   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну в общем то если в записях не простые типы данных, а указатели, то их тоже нужно освобождать перед SetLength и обязательно, а не возможно, иначе утечки. А сами записи SetLength освободит
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2017, 01:37   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Если при добавлении нового элемента массива выделялась память под его внутренние данные, то при удалении этого элемента из массива естественно эту память нужно освободить. Самому, ручками.
northener вне форума Ответить с цитированием
Старый 03.04.2017, 14:15   #6
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Всем большое спасибо за пояснения! Нет, данные у меня в записи простые: строки да числа, но я подумал вдруг, что сама запись - не простой элемент.
Ship_1 вне форума Ответить с цитированием
Старый 03.04.2017, 14:32   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Проще использовать готовые коллекции вместо своих велосипедов с массивами.
TObjectList, TList, ...
Generic (TObjectList<TMyClass>) если 2009+
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.04.2017, 11:51   #8
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Хм... TList, вроде, подошёл бы. Но я программирую только для своих мелких "бытовых" нужд и практически не сталкивался с необходимостью объектов или чего-то ещё, для чего необходимо "Create". И как-то побаиваюсь его... Особенно, если он соседствует с указателями. Единственное, где я использую "Create" - это TStringList, т.к. он мной используется очень часто и является очень простым в создании. Ничего кроме "Create" ему не нужно, и всё, что нужно запомнить - это что в конце его нужно удалить через Free.
Может, есть что-то понятное и полезное для того, кто не сталкивался с применением конструкторов, на русском по работе с TList? Даже в delphibasics какая-то перегрузка в примере с классами и конструкторами в примере.
Ship_1 вне форума Ответить с цитированием
Старый 04.04.2017, 11:56   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 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 все так же, только без дженериков и надо кастовать к нужному типу при доступе
Код:
myObj := TMyClass(objList[0]);
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 04.04.2017 в 12:22.
Alex11223 вне форума Ответить с цитированием
Старый 04.04.2017, 13:00   #10
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну да, у меня до 2009, семёрка. Хорошо, что разница не большая.
Для записей нужно освобождать память?... Что-то не помню я про такое...
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С,С++, как удалить элемент списка? Алексей_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