![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив. [D7, WinXP]
YChak © (2004-07-06 21:11:00)Здраствуйте Мастера!
Давно не пользовался вашей помощью, но теперь хочу совет от вас получить!
Суть проблемы такова:
есть динамический массив TTestArray = array of TMainClass;
Допустим он содержит 3 элемента [0] , [1] и [2]
Как мне грамотно уничтожить элемент в позиции 1, причем нужно чтоб 2-й стал
на его место и массив соответственно усекался б на 1 элемент?
Я делаю так:
...
TMainClass = class
...
pubic
destructor Free;
...
end;
TTestArray = array of TMainClass;
...
var Test:TTestArray;
begin
...
Test[1].Free;
Test[1]:=Test[2];
SetLength(Test,Length(Test)-1);
end;
Что мне здесь не нравится так это то, что я не уверен в правильности очистки памяти,
а как проверить уничтожается ли класс я не знаю:)) особенно вот в этом месте Test[1]:=Test[2];
и после того как усекаю на одну позицию массив!!
Можете мне посоветовать как постипить правильнее?
и вообще где можно больше почитать про динамические массивы и о том как правильно
с ними работать в итаких ситуациях!
P.S. Статьи на сайте и хелп я читал и изучал!
Заранее благодарен!
Anatoly Podgoretsky (2004-07-06 22:19:00) [1]YChak (06.07.04 22:17) [11]
Если TList понравился, то TObjectList понравится еще больше.
YChak (2004-07-06 22:17:00) [2]==> evvcom © (06.07.04 21:53) [8]
Спасибо!! я все понял. Мне нужно было понять что " Объект при этом не клонируется!"
ТListмне очень даже понравился:))
==> Anatoly Podgoretsky © (06.07.04 22:10) [10]
Спасибо, я учту.
Спасибо всем!!!
Anatoly Podgoretsky (2004-07-06 22:10:00) [3]Я тоже сначала не обратил, ни в коем случае не называть деструктор Free, поскольку это существующий метод TObject, второе основной деструктор называть Destroy c обязательным перекрытием, тогда будет задействован механизм Free
Дополнительные деструкторы можно называть как угодно и вряд ли они у тебя когда либо будут.
jack128 (2004-07-06 21:54:00) [4]
> Да в TList точно можно удалить нужный элемент, но как я
> могу использовать TList для хранения своего класса.
>
размер любого класса 4 байта, так что все сможешь..
> Можеш дать мне какойто пример маленький?
см исходники TObjectList, TComponentList
evvcom (2004-07-06 21:53:00) [5]
> Test[1]:=Test[2];
> Test[2].Free; //здесь уничтожается и Test[1] тоже!!!
> Хм... прикольно...
Действительно прикольно. Test[1]:=Test[2] копирует указатель на 2-ой объект. Объект при этом не клонируется! А Test[2].Free убивает этот 2-ой объект. SetLength затирает 2-ой указатель, но не трогает 1-ый, который указывает после Free уже неизвестно на что. При этом о первоначальном 1-ом объекте ты просто забываешь. А на
> pubic
> destructor Free;
что-то я сначала не обратил внимания. Действительно так делать не надо.
YChak (2004-07-06 21:50:00) [6]==> Palladin © (06.07.04 21:42) [5]
нет не все так печально, я понимаю что ем:))
==> evvcom © (06.07.04 21:38) [4]
Да в TList точно можно удалить нужный элемент, но как я могу использовать TList для хранения своего класса.
Можеш дать мне какойто пример маленький?
YChak (2004-07-06 21:44:00) [7]Anatoly только теперь понял твой вопрос!:)))
насчет TMainClass в
destructor Free;
я освобождаю все нормально, в нем я уверен!
Вопрос именно при работу с массивом.
я пробовал
делать так:
...
Test[1]:=Test[2];
Test[2].Free; //здесь уничтожается и Test[1] тоже!!!
SetLength(Test,Length(Test)-1);
...
Palladin (2004-07-06 21:42:00) [8]Хм... прикольно... то есть если ты ешь суп, то ты сомневаешься что ешь суп? Соответственно если ты вызываешь деструктор то ты сомневаешься что вызываешь деструктор? Или ты сомневаешься вообще: а уничтожает ли деструктор объект? Тогда вопрос: ты не доверяешь деструктору как деструктору? Отсюда вытекает: ты думаешь деструкторы введены в Delphi как декорации?
Ну и маленькое замечание... лучше придерживатся стандартов и называть деструктор Destroy; естественно с директивой override;
YChak (2004-07-06 21:38:00) [9]==> Anatoly Podgoretsky © (06.07.04 21:14) [1]
Anatoly ты постоянно здесь на форуме!!. Ты мне помогал и года 2 назад:)) спасибо больщшое!
evvcom (2004-07-06 21:38:00) [10]Так-то все правильно. Test[1].Free разрушает объект [1] TMainClass, Test[1]:=Test[2] копирует указатель на объект [2] на место [1], а SetLength уменьшает размер массива. Все корректно. Но это если работать именно с таким набором элементов. А если их сотня? И удалить таким образом нужно один из первых? Для этого случая удобно использовать TList или его потомков.
YChak (2004-07-06 21:36:00) [11]А Test[1].Free; - здесь и уничтожаю эго! или я чтото не так понял?
Anatoly Podgoretsky (2004-07-06 21:14:00) [12]А нам ничего про TMainClass неизвестно. Если его надо разрушать, то ты должен его разрушить до перемещения жлементов