![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться с поинтэрами [D6, WinXP]
privett © (2009-02-26 21:15:00)У меня вопрос почему приват мемори моей программы разрастается при многократном кликанье по кнопке.
Я видимо не правильно работаю с указателями. прошу помочь разобраться.
И вопрос:
нужно ли GetMem(r, SizeOf(TRR)); (см. код)?
что происходит при TRR.Create ?
резервируется и заполняется место в памяти?
Тогда не нужен гетмем. Но при его убирании сыпятся другие инвалид поинтер оперейшн ошибки.
Прошу помочь понять теорию. Поискал, почитал, но вынужден обратиться. Спасибо.
TCR = class
id:integer;
private
C_r: array[0..100] of ^TRR;
C_r_count: array[0..100] of integer;
CountOfC_r: integer;
public
......
procedure AddCh(Ch:Pointer; Count:integer);
end;
.... в конструкторе TCR
CountOfC_r:=0;
C_r[CountOfC_r]:=nil;
...
procedure TCR.AddCh(Ch:Pointer; Count:integer);
begin
C_r[CountOfC_r]:=Child;
C_r_count[CountOfC_r]:=Count;
Inc(CountOfC_r);
C_r[CountOfC_r]:=nil;
end;
destructor TCompoundResource.Destroy;
var
i:integer;
begin
for i:=0 to CountOfC_r-1 do FreeMem(C_r[i], SizeOf(TRR));
inherited;
end;
//---------------------
procedure TForm1.Button1Click(Sender: TObject);
var
cr:TCR;
r:^TRR;
begin
cr:=TCR.Create;
try
cr.id:=2;
...
GetMem(r, SizeOf(TRR));
r^:=TRR.Create;
r^.id:=1;
....
cr.AddCh(r,5);
finally cr.Free; end;
end;
privett (2009-02-26 23:11:00) [1]все увидел где, сори за пост icon:=nil;
privett (2009-02-26 23:08:00) [2]Я сделал так, спасибо. Первый вопрос не снялся.
TRR = class
id: integer;
name: string;
icon: TBitmap;
public
constructor Create;
destructor Destroy; override;
end;
constructor TRR.Create;
begin
inherited Create;
icon:=TBitmap.Create;
icon:=nil;
end;
destructor TRR.Destroy;
begin
icon.Free;
inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
r:TRR;
begin
r:=TRR.Create;
r.Free;
end;
нажатие на кнопку приводит к постоянному увеличению приват байтс в виртуал мемори. такого быть не должно.
Strate (2009-02-26 22:56:00) [3]
>C_r: array[0..100] of TRR;
Читать как
C_r: array[0..100] of TObject;
Strate (2009-02-26 22:49:00) [4]
> Подразумевалось, что C_r: array[0..100] of ^TRR;хранит количественно
> неопределенный набор объектов.я понял про "без указателей".
> но в их контексте нельзя указать на ошибки?
Почему просто не использовать
C_r: array[0..100] of TRR;
переменная классового типа (и результат, возвращаемый конструктором) -- это указатель на экземпляр класса. То есть, по сути своей - поинтер.
privett (2009-02-26 22:39:00) [5]Подразумевалось, что
C_r: array[0..100] of ^TRR;
хранит количественно неопределенный набор объектов.
я понял про "без указателей". но в их контексте нельзя указать на ошибки?
privett (2009-02-26 22:25:00) [6]TRR - тоже класс. Выкинуть всмысле убрать?
MBo (2009-02-26 21:24:00) [7]что за TRR?
судя по Create - объект.
выкинь указатель на него, и вообще все, связанное с указателями.