Zwalnianie pamięci Tablic nieobiektowych

0

W aplikacji mam kilka tablic ze zmiennymi globalnymi i potrzebuje pomiędzy obliczeniami zwolnić pamięć niektórych z nich by dalsze obliczenia były możliwe.

 
var
Gamma, F,G, dC: extended;
a,b: integer;

begin
a:=14000;
b:=200;

SetLength (Gamma, a, b);
SetLength (G, a, b);
SetLength (F, a, b);
SetLength (dC, a, b);

//Tu są obliczenia na tych tablicach ///


end;

Problem polega na tym że każda z powyższych tablic zajmuje ok 320 Mb pamięci, a ze względu na wymaganą dokładność obliczeń nie mogę zmienić typów zmiennych.

Próbowałem zwalniać pamięć stosując:

 
 ZeroMemory(@Gamma, sizeof(Gamma));        SetLength (Gamma, 0, 0);
 ZeroMemory(@G, sizeof(G));                SetLength (G, 0, 0);
 ZeroMemory(@F, sizeof(F));                SetLength (F, 0, 0);
 ZeroMemory(@dC, sizeof(dC));              SetLength (dC, 0, 0);

Niestety nie przynosi to rezultatów. Jak mogę zwolnić tą pamięć?

0

SetLength (Gamma, 0)

0

Problem polega na tym że każda z powyższych tablic zajmuje ok 320 Mb pamięci, a ze względu na wymaganą dokładność obliczeń nie mogę zmienić typów zmiennych.

Sugerowałbym przemyśleć, czy aby na pewno potrzebujesz wykorzystywać tablice...

Niestety nie przynosi to rezultatów. Jak mogę zwolnić tą pamięć?

Wykonując ZeroMemory na adresie tablicy zerujesz rekord danych o tej tablicy*, przez co psujesz kompletnie wszystko (co innego w momencie, gdyby tam znajdowało się @tablica[0], natomiast zerowanie pamięci tuż przed jej zwolnieniem jest co najmniej dziwne).
Po prostu wywołaj SetLength(Tablica, 0); i tyle.


`*` takie internalsowe `wibbly wobbly timey wimey... stuff`, w których jest zapisany rozmiar tablicy i parę innych danych.
0

Potrzebuje tablic by mieć dostęp do danych pośrednich.
Patryk27 miałeś rację ZeroMemory przed SetLength powodowało, że tablica została wyczyszczona z danych - wypełniona zerami ale nie usuwało jej z pamięci. Samo SetLength usuwa ją z pamięci.

PS Co jest lepsze /efektywniejsze /szybsze, zwalnianie pamięci czy wypełnianie tablic 0? Oczywiście w przypadku gdy mam dostateczną ilość pamięci.

0

Tablice dynamiczne są usuwane gdy wypadają z zasięgu, czyli przy end; funkcji, w której są zdefiniowane. W normalnie napisanym kodzie nie trzeba ich zwalniać.

0
Pegii napisał(a)

PS Co jest lepsze /efektywniejsze /szybsze, zwalnianie pamięci czy wypełnianie tablic 0?

Co ma wspólnego zerowanie ze zwalnianiem pamięci?
Jeżeli chcesz ustawić wszystkie elementy na zero, to użyj ZeroMemory; jeżeli chcesz zwolnić tablicę z pamięci, to ją zwolnij za pomocą SetLength. Nie rozumiem pytania.


Azarien napisał(a)

Tablice dynamiczne są usuwane gdy wypadają z zasięgu, czyli przy end; funkcji, w której są zdefiniowane.

Tablice dynamiczne są usuwane, gdy ich licznik referencji jest równy zero.

1 użytkowników online, w tym zalogowanych: 0, gości: 1