Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

Динамический массив.   Найти похожие ветки 

 
YChak   (2004-07-06 21:11) [0]

Здраствуйте Мастера!
Давно не пользовался вашей помощью, но теперь хочу совет  от вас получить!

Суть проблемы такова:

есть динамический массив 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 21:14) [1]

А нам ничего про TMainClass неизвестно. Если его надо разрушать, то ты должен его разрушить до перемещения жлементов


 
YChak   (2004-07-06 21:36) [2]

А Test[1].Free; - здесь и уничтожаю эго! или я чтото не так понял?


 
YChak   (2004-07-06 21:38) [3]

==> Anatoly Podgoretsky ©   (06.07.04 21:14) [1]
 Anatoly ты постоянно здесь на форуме!!.  Ты мне помогал и года 2 назад:)) спасибо больщшое!


 
evvcom ©   (2004-07-06 21:38) [4]

Так-то все правильно. Test[1].Free разрушает объект [1] TMainClass, Test[1]:=Test[2] копирует указатель на объект [2] на место [1], а SetLength уменьшает размер массива. Все корректно. Но это если работать именно с таким набором элементов. А если их сотня? И удалить таким образом нужно один из первых? Для этого случая удобно использовать TList или его потомков.


 
Palladin ©   (2004-07-06 21:42) [5]

Хм... прикольно... то есть если ты ешь суп, то ты сомневаешься что ешь суп? Соответственно если ты вызываешь деструктор то ты сомневаешься что вызываешь деструктор? Или ты сомневаешься вообще: а уничтожает ли деструктор объект? Тогда вопрос: ты не доверяешь деструктору как деструктору? Отсюда вытекает: ты думаешь деструкторы введены в Delphi как декорации?

Ну и маленькое замечание... лучше придерживатся стандартов и называть деструктор Destroy; естественно с директивой override;


 
YChak   (2004-07-06 21:44) [6]

Anatoly только теперь понял твой вопрос!:)))
насчет TMainClass в

destructor Free;

я освобождаю все нормально, в нем я уверен!
Вопрос именно при работу с массивом.

я пробовал
делать так:

...
Test[1]:=Test[2];
Test[2].Free; //здесь уничтожается и Test[1] тоже!!!
SetLength(Test,Length(Test)-1);
...


 
YChak   (2004-07-06 21:50) [7]

==> Palladin ©   (06.07.04 21:42) [5]
   нет не все так печально, я понимаю что ем:))

==> evvcom ©   (06.07.04 21:38) [4]
   Да в TList точно можно удалить нужный элемент, но как я могу использовать TList для хранения своего класса.
   Можеш дать мне какойто пример маленький?


 
evvcom ©   (2004-07-06 21:53) [8]


> 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;

что-то я сначала не обратил внимания. Действительно так делать не надо.


 
jack128 ©   (2004-07-06 21:54) [9]


> Да в TList точно можно удалить нужный элемент, но как я
> могу использовать TList для хранения своего класса.
>    
размер любого класса 4 байта, так что все сможешь..

> Можеш дать мне какойто пример маленький?
см исходники TObjectList, TComponentList


 
Anatoly Podgoretsky ©   (2004-07-06 22:10) [10]

Я тоже сначала не обратил, ни в коем случае не называть деструктор Free, поскольку это существующий метод TObject, второе основной деструктор называть Destroy c обязательным перекрытием, тогда будет задействован механизм Free
Дополнительные деструкторы можно называть как угодно и вряд ли они у тебя когда либо будут.


 
YChak   (2004-07-06 22:17) [11]

==> evvcom ©   (06.07.04 21:53) [8]
 Спасибо!! я все понял. Мне нужно было понять что "Объект при этом не клонируется!"
ТList мне очень даже понравился:))
==> Anatoly Podgoretsky ©   (06.07.04 22:10) [10]
   Спасибо, я учту.

Спасибо всем!!!


 
Anatoly Podgoretsky ©   (2004-07-06 22:19) [12]

YChak   (06.07.04 22:17) [11]
Если TList понравился, то TObjectList понравится еще больше.



Страницы: 1 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
1-1088689276
Анонимщик
2004-07-01 17:41
2004.07.18
try ... finally


9-1073408254
Elf
2004-01-06 19:57
2004.07.18
TImage


1-1089089115
Валентин
2004-07-06 08:45
2004.07.18
runtime packages


8-1083349209
GlavBOTan
2004-04-30 22:20
2004.07.18
Wave-header


4-1086339082
SigalX
2004-06-04 12:51
2004.07.18
Как свернуть программу в значок около часов???