1 / 2
Feb 2017

Przez przypadek zrobiłem kod który miał wyciek pamięci i sędzia pokazał że złużyłem 3 GB ramu ( ale miał bład i sędzia go odrzucił ) .
Tak z już celowo ciekawości wsadziłem do programu dodatkową linijkę na początku programu która zamawia 2 GB ramu

SetLength( Tab, 2*1024*1024*1024 );.

Wrzucam tak zmodyfikowany program i widzę że mój program po wykonaniu się ma wynik że użyto tylko 852 kB ramu. Czyżby sędzia nie wychwycił przekroczenia pamięci ??
Dodam jeszcze że nie zwalniałem tej pamięci na końcu programu .

  • created

    Feb '17
  • last reply

    Jul '21
  • 1

    reply

  • 1.1k

    views

  • 2

    users

  • 3

    likes

4 years later

Wiem, ze stary watek, ale moze komus sie przyda taka wiedza.

Niektore systemy operacyjne (przykladowo linux) zarządzają pamięcią w bardzo specyficzny sposób, tzn, zaalokowanie pamięci nie powoduje automatycznego zarezerwowania obszaru pamięci dla programu. Dopiero, gdy program skorzysta z tej pamięci, system go zarezerwuje.

Przykład w “C”:

#include  <stdio.h>
#include <stdlib.h>
#include <string.h>
/* app <rozmiar_do_zaalokowania> <rozmiar_do_uzycia> */
int main(int argc, char * argv []) {
  if (argc > 2) {
    char * array = (char *)malloc(atoi(argv[1]));
    int size = atoi(argv[2]);
    memset(array, 'x', size);
    printf("adres konca uzytego obszaru: %p\n", (void *)(array + size));
  }
  return EXIT_SUCCESS;
}

Wywolanie i uzycie pamieci (w kazdym tescie alokuje ok 2GB):

./app 2000000000 100
uzycie: 1.42M  

./app 2000000000 1000000
uzycie: 2.45M

./app 2000000000 10000000
uzycie: 11.04

./app 2000000000 100000000
uzycie: 96.87M

./app 2000000000 1000000000
u mnie system crash, za malo zasobow

Pzdr.

Suggested Topics

Want to read more? Browse other topics in System SPOJ or view latest topics.