Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Вниз

работа с памятью   Найти похожие ветки 

 
ghg   (2003-12-20 16:03) [0]

Имеем следующую процедуру:


...

piket : array of Tdata_piket;
hide_piket : array of Tdata_piket;

....

procedure TData_Ked.hide(number: integer);
var tek_pik : ^TData_piket;
begin
setlength(hide_piket, length(hide_piket)+1);
hide_piket[length(hide_piket)-1]:=Tdata_piket.create;

New(tek_pik);
tek_pik^:=piket[Number];
Piket[Number]:=piket[length(piket)-1];
hide_piket[length(hide_piket)-1]:=tek_pik^;

setlength(piket, length(piket)-1);
Dispose(tek_pik);
end;


Задача этой процедуры в следующем, взять нужный элемент из массива Piket и перенести ее в массив Hide_piket.

Вопрос: Все ли здесь нормально при работе с памятью, не будет ли утечек и если можно сделать лучше то как?

Если нужны уточнения, то я их дам. Заранее спасибо.


 
MBo   (2003-12-20 16:08) [1]

судя по
:=Tdata_piket.create;
Tdata_piket - объект. Так зачем использовать крыжик ^ ???
И перенос сделан как-то странно и запутанно.

Воспользуйся вместо массивов TList или TObjectList - все упростится.


 
ghg   (2003-12-20 16:23) [2]

>MBo © (20.12.03 16:08) [1]
Пока нет возможности использовать что-либо другое кроме дин.массивов

мой вопрос можно переформулировать по другому:
есть два объекта A и B, содержащих в себе дин.массивы

при Create каждого выделяется память для них
потом мы пишем
A:=B;
теперь эти A и B указывают на одну область памяти, теперь вопрос а куда делатсь та память которую мы выделили для A при ее Create?
Она освободилась или нет?


 
MBo   (2003-12-20 16:31) [3]

A:=B;
Что есть A и B?
Если это объекты, нужно сделать метод Assign(To) (для наследников TPersistent), осуществляющий "глубокое копирование", т.е. копирующий каждое поле, в том числе динамические массивы поэлементно.
А простое присвоение без этого - два указателя будут указывать на одну область, но старые данные из A будут занимать память - утечка.


 
ghg   (2003-12-20 16:41) [4]

>MBo © (20.12.03 16:31) [3]

Это наследники TObject, у них нет Assign.

ТОгда скажите как поменять местами значения A и B, без утечек?
Если знать что A и B наследники TObject содержащие дин.массивы.


 
panov   (2003-12-20 16:49) [5]

Ты бы показал, как у тебя описан Tdata_piket...


 
ghg   (2003-12-20 16:54) [6]


TData_Piket=class
public
size : Integer;
kol_duble : integer;
active_duble : integer;
filter : shortstring;
eds_online : single;
Main : Tdata_piket_duble;
theo : Tdata_piket_sintetics;
margin : Tdata_piket_sintetics;
dubles : array of Tdata_piket_duble;
constructor Create;
destructor Destroy; override;
procedure save;
procedure load;
procedure GetData(number_duble : integer);
procedure new_load(path_file : string);
procedure add_duble(file_name : string);
procedure del_duble(number : integer);
procedure sglazh;
procedure summ(dubl : array of integer);
procedure ostat_pole;
end;


Tdata_piket_duble и Tdata_piket_sintetics это примерно такой же структуры типы, но они не содержат дин.массивов


 
MBo   (2003-12-20 17:01) [7]

A,B,Temp: TSomeObject;

Temp:=A;
A:=B;
B:=Temp;

А если понадобится нечто большее, чем такой обмен, все же задумайся - для чего в Борланд придумали TPersistent


 
ghg   (2003-12-20 17:01) [8]

В смысле Tdata_piket_duble и Tdata_piket_sintetics содержат в себе обычные типы данных (integer, shortstring и т.д.) и статические массивы.


 
ghg   (2003-12-20 17:12) [9]

>MBo © (20.12.03 17:01) [7]

Про Tpersistent я понял, буду разбираться, очень вероятно что все мои объекты сделаю наслединками от него.

Но пока возникают все-таки два вопроса

1) Temp:=A;
после этого у нас не утекает память выделенная при создании Temp?

2) Как после всех этих операторов освободить переменную Temp, так чтобы не испортить B, ведь они после проведенных операций указывают на одно место в памяти указывают на одно место?


 
MBo   (2003-12-20 17:19) [10]

1) Temp - неинициализированная переменная.
2) Не используй Temp, а память освободится при B.Free
(можешь Tmp:=Nil присвоить, если есть желание)

Этот способ применим при отсутствии Assign



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

Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
3-11807
Vera
2003-12-08 07:22
2004.01.05
FIBQuery и Dbgrid


11-11844
titnn
2003-04-15 22:59
2004.01.05
Почему DLL сделанная в KOL не работает ?


1-11902
sohat
2003-12-18 10:14
2004.01.05
Как создать приложение запускаемое как сервис?


8-12008
xn0bys
2003-08-29 08:23
2004.01.05
Как создать на клиентской части формы БИТМАП (НЕ канву).


14-12115
AxxxE
2003-12-15 20:05
2004.01.05
Mafia





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский