Programowanie w języku C/C++

Realloc

  • 2010-10-31 18:27
  • 0 komentarzy
  • 1671 odsłon
  • Oceń ten tekst jako pierwszy
void *realloc(void *p, size_t size);

<justify>Funkcja zmienia rozmiar obiektu wskazanego przez wskaźnik p na wartość określoną przez size. Cała istota działania funkcji realloc polega na tym, że najpierw znajduje ona miejsce na nowy obszar pamięci, następnie kolejno kopiuje dane oryginalne w nowe miejsce, zwalnia stary obszar pamięci oraz zwraca wskaźnik do nowego obszaru. Niepowodzenie realokacji sygnalizowane jest poprzez zwrócenie wartości NULL.</justify>

Może się zdarzyć, że zwrócony zostanie ten sam wskaźnik, który został podany jako argument i nie należy tego traktować jako błąd.

Błędem natomiast jest realokacja miejsca w poniższy sposób:
int main (int argc, char* argv[])
{
  int *p;
 
  p = malloc(10 * sizeof(int));  /* alokacja miejsca pod 10 elementów typu int */
 
  /* ... */
 
  p = realloc(p, 20 * sizeof(int));  /* realokacja miejsca na 10 elementów typu int więcej */
 
   /* ... */
 
 free(p);  /* zwolnienie obszaru wskazywanego przez p */
}

Uwagę należy zwrócić na to, że przy niepowodzeniu realokacji, pod wskaźnik p zostanie podstawiona wartość NULL, co skutkuje utratę poprzedniej wartości p oraz przede wszystkim tzw. Wyciek pamięci.

Oto, jak należy poprawnie przeprowadzić wspomnianą realokację pamięci:
int main (int argc, char* argv[])
{
  int *p;
  void *tmp;  /* tymczasowy wskaźnik typu void */
 
  p = malloc(10 * sizeof(int));  /* alokacja miejsca pod 10 elementów typu int */
 
  /* ... */
 
  if( (tmp = realloc(p, 20 * sizeof(int))) == NULL )
  {
    /* odpowiednie działania w przypadku błędu realokacji */
  }
  else
  {
    p = tmp;
  }
 
   /* ... */
 
 free(p);  /* zwolnienie obszaru wskazywanego przez p */
}


Warto zauważyć pewną własność funkcji realloc:
          realloc(NULL, n)malloc(n);
          realloc(p, 0)free(p);

Powyższe zależności mogą być wykorzystane przy używaniu realloc w pętli w celu budowy dynamicznej struktury takiej jak lista z dowiązaniami.





Zobacz też: