Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1087805551
Yurko
2004-06-21 12:12
2004.07.18
Сравнение таблиц (помогите составить запрос)


3-1087386162
Andrey V.
2004-06-16 15:42
2004.07.18
Реально ли это сделать одним запросом ?


14-1088162043
Nickola2
2004-06-25 15:14
2004.07.18
Пожалуйста, помогите с дистрибьютивом.


14-1088541007
Sanek_metaller
2004-06-30 00:30
2004.07.18
Инет магазины,где продаются MP3


8-1083481501
NewOldMan-NOM
2004-05-02 11:05
2004.07.18
2D вечен?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский