![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дин.массив на выходе ф-ции и утечка [D7]
GanibalLector © (2007-01-10 23:26:00)При использовании такой конструкции получаю утечку на всю длину массива :
function Get(...): Pointer;
var
V: array of sometype;
begin
SetLength(V, xxx);
...
Inc(PLongint(Longword(V) - 8)^);
Result := V;
end
Вопрос : как, собственно, избавится от данной проблемы ?
Заранее спасибо.
Игорь Шевченко (2007-01-10 23:35:00) [21]
> Inc(PLongint(Longword(V) - 8)^);
А это зачем ?
GanibalLector (2007-01-10 23:28:00) [22]Весь код :
type
TMyData = packed record
Mode:Byte;
Data:array of String[$FF];
end;
PMyData = ^TMyData;
var
Form1: TForm1;
implementation
{$R *.dfm}
function Potok(Param:PMyData):DWord;
var I:Integer;
begin
// работаем с массивом ...
Param.Data:=nil; // освобождение дин.массива
Dispose(Param);
Result:=0;
end;
function GetData:Pointer;
var S:array of String[$FF];
I:Integer;
const Count = 150;
begin
SetLength(S,Count);
for I:=0 to Count-1 do
S[I]:='Test'+IntToStr(I);
Inc(PLongint(LongWord(S) - 8)^);
Result := S;
end;
procedure TForm1.Button1Click(Sender: TObject);
var ThreadID:DWord;
Obj:PMyData;
begin
New(Obj);
Obj^.Mode:=$A;
// так работает БЕЗ УТЕЧЕК
SetLength(Obj^.Data,3);
Obj^.Data[0]:='Test1';
Obj^.Data[1]:='Test2';
Obj^.Data[2]:='Test3';
// а так С УТЕЧКОЙ
//Obj^.Data:=GetData;
CloseHandle(BeginThread(nil,0,@Potok,Obj,0,ThreadID));
end;
end.