![]() |
| ||
|
|
Новости |
Поиск |
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
Вопрос : как, собственно, избавится от данной проблемы ?
Заранее спасибо.
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)^);
Вероятно, счетчик ссылок увеличивается. Правда, зачем, действительно, непонятно.