Форум: "Основная";
Текущий архив: 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