Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дин.массив на выходе ф-ции и утечка [D7]


Страницы:   1 2

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


Вопрос : как, собственно, избавится от данной проблемы ?
Заранее спасибо.


Anatoly Podgoretsky   (2007-01-11 11:22:00) [1]


> Динимические массивы не размещены на стеке!!!

Все правильно, сбило с толку это String[$FF];


oxffff   (2007-01-11 11:07:00) [2]


> А pointer(a) счётчик ссылок не увеличит?


Нет.
А с чего он вдруг должен увеличить счетчик у указателя(pointer).


tesseract   (2007-01-11 10:43:00) [3]


> oxffff ©   (11.01.07 08:56) [16]


А pointer(a) счётчик ссылок не увеличит?


oxffff   (2007-01-11 10:21:00) [4]

to Джо

Цитата А.П. "Массив размещен на стеке и прекращает свое существование
при выходе из процедуры"

Ответ неверный. Тогда было и бы AV.


oxffff   (2007-01-11 10:14:00) [5]


> Джо ©   (11.01.07 09:45) [17]
> > [16] oxffff ©   (11.01.07 08:56)
> > Это не верно!!!
> > Динимические массивы не размещены на стеке!!!
>
> Сама переменная массива — размещена. Его елементы, разумеется,
>  нет.


Цитата А.П. : "Массив размещен на стеке".

Где здесь речь о переменной?

>И зачем опять извращаться со счетчиком ссылок?

Этот пример исключительно показать, что можно как и в [0].
Указать, что его get функция [0] корректна.


Джо   (2007-01-11 09:45:00) [6]

> [16] oxffff ©   (11.01.07 08:56)
> Это не верно!!!
> Динимические массивы не размещены на стеке!!!

Сама переменная массива — размещена. Его елементы, разумеется, нет.


> Вот пример.

И зачем опять извращаться со счетчиком ссылок?


oxffff   (2007-01-11 08:56:00) [7]


> Anatoly Podgoretsky ©   (10.01.07 23:38) [4]
> > GanibalLector  (10.01.2007 23:28:01)  [1]
>
> Массив размещен на стеке и прекращает свое существование
> при выходе из процедуры.


Это не верно!!!
Динимические массивы не размещены на стеке!!!

Вот пример. Утечек нет.

mytype=array of string[255];

function getData:pointer;
var a:mytype;
begin
setlength(a,10);
Inc(PLongint(Longword(a) - 8)^);
result:=a;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:mytype;
begin
pointer(a):=getData;
end;

А если сделать так, то утечка есть.

procedure TForm1.Button1Click(Sender: TObject);
var a:mytype;
begin
a:=getData;
end;


GanibalLector   (2007-01-11 01:30:00) [8]

Опс...действительно ;) пардон.
Всем спасибо!


ors_archangel   (2007-01-11 01:25:00) [9]

obj.data должно быть тоже типа TArray


GanibalLector   (2007-01-11 01:11:00) [10]

2 Джо ©   (11.01.07 00:39) [12]
Сделал.

Теперь  :

function Get: TArray;
begin
SetLength(Result,2);
Result[0] := 'test1';
Result[1] := 'test2';
end;

procedure TForm1.Button1Click(Sender: TObject);
 var ThreadID:DWord;
     Obj:PMyData;
begin
 New(Obj);
 Obj^.Mode:=$A;
  Obj^.Data:=Get; // Incompatible types
 CloseHandle(BeginThread(nil,0,@Potok,Obj,0,ThreadID));
end;


Джо   (2007-01-11 00:39:00) [11]

> Например, function Get: array of String[$FF];

Делай так:

type
 TArray = array of sometype;

function Get: TArray;


GanibalLector   (2007-01-11 00:25:00) [12]

2 Джо ©   (11.01.07 00:16) [10]
А оно так не компилируется. Я про array of sometype.
Например, function Get: array of String[$FF];


Джо   (2007-01-11 00:16:00) [13]

> [9] GanibalLector ©   (10.01.07 23:57)
> 2 Джо ©   (10.01.07 23:41) [6]
> Не совсем понял что имелось ввиду.  TArray это что ???

array of sometype;


GanibalLector   (2007-01-10 23:57:00) [14]

2 Джо ©   (10.01.07 23:41) [6]
Не совсем понял что имелось ввиду.  TArray это что ???


Loginov Dmitry   (2007-01-10 23:45:00) [15]

> При использовании такой конструкции получаю утечку на всю
> длину массива


А что-то иное предполагалось?


tesseract   (2007-01-10 23:42:00) [16]


> Anatoly Podgoretsky ©   (10.01.07 23:38) [4]


опередил :-)


Джо   (2007-01-10 23:41:00) [17]

Я не понимаю, почему бы не сделать так:

function Get: TArray;
begin
 SetLength(Result,N);
 Result[i] := ....
 ...
end;


tesseract   (2007-01-10 23:41:00) [18]

Так попробуй, указатели лучше в функцию передавать.


type MyType:=array of string[$FF];
procedure GetData(var S:MyType):
var
 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)^);
end;


Anatoly Podgoretsky   (2007-01-10 23:38:00) [19]

> GanibalLector  (10.01.2007 23:28:01)  [1]

Массив размещен на стеке и прекращает свое существование при выходе из процедуры.


Джо   (2007-01-10 23:37:00) [20]

Inc(PLongint(Longword(V) - 8)^);
Вероятно, счетчик ссылок увеличивается. Правда, зачем, действительно, непонятно.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо