[Pascal] Alokacja pamięci

0
  1. Czym się różnią:
    New();
    AllocMem();
    GetMem();

  2. Co się stanie jeśli pod koniec programu nie zwolnię wszystkich dynamicznych globali (przez FreeMem na przykład)?

0
  1. pomoc delphi (F1) albo poszukaj na 4p, jest to opisane i tu i tu
  2. wywali ci blad acess voliation (chyba)i zostana reszti w pamieci, jesli bedziem tego duzo to bedzie zwalniac ci kompa bo pamiec sie zapcha

// jak wywolywalem DLL to wywalilo mi taki blad jak nie wyrzucilem DLL z pamieci :) ale masz racje, przy tworzeniu rowniez sie pojawia :) ach te windowsy :) no chyba ze sie walnolem :)

0

A dlaczego niby ma wywalić Access Violation? Ten błąd pojawi się przy odwrotnej sytuacji - jeśli nic nie zaalokujesz i będziesz się odwoływał do tego obszaru.

U mnie jest tak (ten mój kochany WinMe :-P) że jak testuję progs w BCB i zapomnę zwalniać pamięć to wyskakuje mi BSOD przy zamykaniu Windozy. Wtedy wiem, że progs do poprawki :d.

[<font color="blue">dopisane</span>]
Ja nie odpowiadałem na Twój post ale pisałem do wesoledi.

0

Dzięki za wszystkie odpowiedzi ALE
Zaglądajcie czasami na prefixy - gdzie wy macie Access Violation w PASCALU :-)
// dobre, dobre - ŁF

Chodzi o to że jak deklaruję byczą zmienną przez GetMem to wywala błąd a przy AllocMem nie, tylko mi później Pascal zaczyna wariować
(i przy zwalnianiu błąd wyskakuje)

//
aha, i jeszcze jedno: jak uzyskać dostęp do pamięci rozszerzonej; max heap size mogę ustawić na co najwyżej 650 KB, a przydałoby się o dobre kilka mega więcej...

0

ściągnij sobie bibliotekę do obsługi pamięci EMS (musisz mieć odpalony i aktywny emm386): http://4programmers.net/download.html?id=442 i http://4programmers.net/download.html?id=1003.

co to jest "bycza zmienna"? i tak nie przekroczysz 65520 bajtów... w ogóle skąd wytrzasnąłeś coś takiego jak AllocMem? W TP używa się trzech par funkcji do alokacji pamięci na stercie:
New/Dispose - pobierają od razu pamięć na całą zmienną (tak jak GetMem(x,SizeOf(x));
GetMem/FreeMem - musisz im przekazać ilość pamięci do zaalokowania;
Mark/Release - do czyszczenia części sterty;
funkcje nie są wymienialne, tzn. pamięci pobranej GetMem nie zwolnisz Dispose i vice versa, ale jak zrobisz Release, to zwolnisz całą pamięć od pewnego miejsca zamarkowanego poprzez Mark (niezależnie od tego, jaką funkcją została zaalokowana).
A skąd wytrzasnąłeś AllocMem?

"Max heap size" to dużo mniej niż 650kB, przecież gdzieś leży stos, kod Twojego i innych programów. Możesz sobie mazać po pamięci karty graficznej (segment $A000) - zawsze 64kB do przodu, a z zachowaniem pewnej ostrożności po HMA (segment $FFFF). Ale paradoksalnie najprościej będzie zrobić sobie własnego menedżera pamięci EMS (możesz skorzystać z gotowego obiektu TEMSObject czy jak go tam nazwałem).

A jeśli nie posprzątasz po swoim programie, to i tak zamykając go zwalniasz całą jego pamięć, więc teoretycznie nie musisz zwalniać pamięci zmiennych globalnych - ale jest to w dość "złym tonie". Zresztą łatwo możesz to sprawdzić alokując pamięć i nie zwalniając jej wypisać zawartość MemAvail - i taki program odpalić kilka razy. [glowa]

Ufff... ale co to jest "bycza zmienna"? sprecyzuj o co Ci chodzi, albo podeślij mi na priv kod źródłowy.

0

co to jest "bycza zmienna"? i tak nie przekroczysz 65520 bajtów...

Może nie skumałem, ale zaalokować można tyle pamięci, ile chcemy (lub ile jest wolnej - zależy, czy system w tle obsługuje swap file)
http://4programmers.net/view_faq.html?id=364

0

Wielkie dzięki wszystkim za odpowiedzi - [browar]

Zainstalowałem sobie Free Pascala i skończyły się problemy z alokacją :-) Na marginesie - ta bycza zmienna to np. coś takiego:

type
TRek = record
        ar: array[1..4096] of LongInt;
        l: Word;
        end;

var
bycza: array[1..10000] of ^TRek
...
0

ta bycza zmienna to np. coś takiego:

Phi, przecież to raptem 40000 bajtów, co w tym takiego dużego?

0

ta bycza zmienna to np. coś takiego:

Phi, przecież to raptem 40000 bajtów, co w tym takiego dużego?

Ty liczysz tylko statyczną zmienną, a jemu zapewne chodzi o to, że chce zaalokować pamięć dla każdego wskaźnika więc... ponad 150MB :)
Chociaż jego sformułowanie jest bardzo nieprecyzyjne :)

0

Wielkie dzięki wszystkim za odpowiedzi - [browar]

Zainstalowałem sobie Free Pascala i skończyły się problemy z alokacją :-) Na marginesie - ta bycza zmienna to np. coś takiego:

type
TRek = record
        ar: array[1..4096] of LongInt;
        l: Word;
        end;

var
bycza: array[1..10000] of ^TRek
...

Proponuję pobawić się plikami. Niestety. Wrzuciłem unit do obsługi UMB. Ale on nie wiele daje pod łinzgrozą (faktycznie ujmuje ze sterty). Albo XMS, albo EMS. Innej mozliwości nie ma. Chyba, że skompilujesz to do dpmi (bp7). U mnie mam ok 32MB do dyspozycji. I nadal piszesz pod dos'a. Nigdy nie korzystałem (nie musiałem) Z mark/release, ale co do getmem/freemem i new/dispose to nadal obowiązują te same zasady. Jednorazowe 65536 bajtów jest juz nieosiągalne.

poza tym urzywając bp/tp warto pamiętać o jednym skrócie
ctrl o+ctrl o (OO) :

{$a-,$b+... itepe }
{$m 4096,327600,655360}
w helpie jest opis. Ważna dla ciebie jest druga linijka. Opis pamięci potrzebnej programowi. W zależności od celu kompilacji (real/dpmi/windows) wyskakują różne znaczki i nie zawsze te tryby sie pokrywają.

Aha. Do dpmi program doczytuje jeszcze ze dwa pliki (rtm.exe i chyba jakąś dll-ke - dawno nie tego używałem)- drajwery.

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