Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизДинамический массив. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.031 c