Chcę raz na zawsze być pewny.
Mamy taką sytuację:
setLength(DynArray1, x);
for i:=low(DynArray1) to high(DynArray1) do DynArray[i]:=[i];
I teraz chcemy, aby zawartość DynArray1 była w drugiej tablicy. Rozwiązania są 3.
- Iteracja i przepisanie każdej wartości
- DynArray2:=DynArray1;
- copyMemory(dynArray2, dynArray1, sizeof(TypTablicy)*length(dynArray1));
Weźmy przypadek pierwszy. Na początku robimy setLength na dynArray2, potem przepisujemy wszystkie wartości w pętli. Proste i zawsze działa.
Ad 2. Skoro tablica dynamiczna to tak naprawdę wskaźnik, oznacza to, że tablica dynArray2 zaczyna wskazywać na miejsce dynArray1. A jeśli teraz dynArray1 jest składnikiem jakiejś klasy(a dynArray2 nie), to po zniszczeniu tej klasy powinienem dostać w najlepszym wypadku AV po odwołaniu w stylu: dynArray2[i], tak? (w najgorszym zupełnie inne dane)
Ad 3. Załóżmy, że przydzielam pamięć jednorazowo do tablicy, tzn. robię:
setLength(dynArray1, x);
a nie:
for i:=0 to x-1 do
begin
setLength(dynArray1, 1);
//jakieś inne operacje
end;
Analogicznie przydzielam pamięć do dynArray2.
W tym wypadku copyMemory powinno zawsze poprawnie zadziałać, tak?
Ale jeśli przydzielałbym pamięć stopniowo(setLength w pętli), to wtedy jest możliwość, że mógłbym w dynArray2 dostać inne dane lub AV, tak?
Czy mój tok rozumowania jest poprawny?