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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-11896
TUser
2003-12-18 12:54
2004.01.05
extract


14-12133
Beaver
2003-12-13 14:21
2004.01.05
Глюки компиляции


14-12088
Igor
2003-12-15 12:14
2004.01.05
Delphi - Lazarus


3-11825
DiFar
2003-12-08 13:38
2004.01.05
Изменение типа поля


8-12000
-= ALEX =-
2003-08-25 16:24
2004.01.05
Звук