Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 10.07.09 12:16 
Ich habe folgende Situation:
Eine funktion liefert als RückgabeTyp ein dynamisches ByteArray
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function foo():TDynByteArray;
begin
SetLength(Result,100);
end;

das weise ich einer variable zu:
ausblenden Delphi-Quelltext
1:
temp:=foo();					

was passiert jetzt, wenn ich nochmal temp:=foo(); mache?
hab ich dann das vorherige array verloren (memleak?)
und was ist mit:
ausblenden Delphi-Quelltext
1:
2:
temp:=foo();
temp2:=temp;

habe ich dann 2 mal den speicher des arrays, oder sind temp und temp2 nur pointer auf das array und nur der pointer wurde kopiert?
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Fr 10.07.09 13:19 
Also entschuldige, falls das nicht so ist, aber eigentlich müsste Deine Frage doch mit diesem Thread
Dynamisches Array im record
beantwortet sein - oder?
Sonst hättest Du Deine Frage doch auch dort anhängen können...

---Oder habe ich Dich jetzt total missverstanden?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 10.07.09 16:08 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  a,b:TDynIntArray;
begin
   a := foo;
   a[10]:=10;
   b:=a;
   SetLength(b,0);
   Showmessage(IntToStr(a[10]));
   Showmessage(IntToStr(High(b)));
   Showmessage(IntToStr(High(a)));
end;


bissel so wie bei Strings ....

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 10.07.09 17:00 
Kleines Beispiel, hoffe dass ich mich hierbei nun nicht vertan habe. ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
type
  TDynArray = Array of Integer;

function Foo(ALength: Integer): TDynArray;
begin
  SetLength(Result, ALength);
end;

procedure Demo;
var
  dA: TDynArray;
   p: Pointer;
begin
  dA := Foo(150); // Length dA = 150
  Pointer(TDynArray(p)) := @(TDynArray(dA)); // p Zeiger auf dA
  dA := Foo(100);  // Length dA = 100

  ShowMessage(IntToStr(Length(TDynArray(p^)))); // Length = 100!

  TDynArray(p^)[150] := 2;

  ShowMessage(IntToStr(DWORD(p^)));  // $10530968
  ShowMessage(IntToStr(TDynArray(Pointer(DWORD(10530968)))[150])); // = 2; 4 Bytes davor korrekterweise 0!
  ShowMessage(IntToStr(dA[150])); // Die Struktur bleibt im Speicher noch erhalten,
                                  // bis der Bereich entweder überschrieben, mittels
                                  // SetLength(dA, 0) oder mittels Beenden des Programmes freigegeben wird! ;-)
end;

Edit: Ich muss zugeben, dass die Spielerei mit den Pointern im Grunde redundant ist... :P

Grüße,
Marc
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 10.07.09 17:18 
user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
Kleines Beispiel, hoffe dass ich mich hierbei nun nicht vertan habe. ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
type
  TDynArray = Array of Integer;

function Foo(ALength: Integer): TDynArray;
begin
  SetLength(Result, ALength);
end;

procedure Demo;
var
  dA: TDynArray;
   p: Pointer;
begin
  dA := Foo(150); // Length dA = 150
  p := @dA; // p Zeiger auf dA (BenBE: Etwas verkürzt)
  dA := Foo(100);  // Length dA = 100

  ShowMessage(IntToStr(Length(TDynArray(p^)))); // Length = 100!

  TDynArray(p^)[150] := 2//BenBE: AV weil Index out of Bounds

  ShowMessage(IntToStr(DWORD(p^)));  // $10530968 (BenBE: Undefined, weil uninitialisiert, liefert den Inhalt der ersten Adresse)
  ShowMessage(IntToStr(TDynArray(Pointer(DWORD(10530968)))[150])); // = 2; 4 Bytes davor korrekterweise 0! (BenBE: BLOSS NICHT!!!*)
  ShowMessage(IntToStr(dA[150])); // Die Struktur bleibt im Speicher noch erhalten,
                                  // bis der Bereich entweder überschrieben, mittels
                                  // SetLength(dA, 0) oder mittels Beenden des Programmes freigegeben wird! ;-) (BenBE: Index out of Bounds)
end;

Edit: Ich muss zugeben, dass die Spielerei mit den Pointern im Grunde redundant ist... :P

Grüße,
Marc


*Die Adresse eines Zeigers bekommt man mit DWORD(p) und nicht DWORD(p^). Letzteres ist der Wert der Speicherzelle, auf die der Zeiger zeigt als DWORD interpretiert.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 10.07.09 17:50 
also kurz: bei der neuen zuweisung eines arrays wird nur der pointer überschrieben. ich muss das alte array also vorher freigeben...