Fandom

C/C++

Alokowanie i zwalnianie pamięci

53strony na
tej wiki
Dodaj nową stronę
Dyskusja0 Udostępnij

Operator delete oraz delete [] Edytuj

Odpowiednio po użyciu operatorów new/new [] stosuje się operatory delete oraz delete [] do zwolnienia wcześniej przydzielonej pamięci:
delete - operator zwalnia pamięć jednej zmiennej zadeklarowanej przy pomocy new
delete [] - operator zwalnia całą tablicę zadeklarowaną przy pomocy new [].

Użycie zarówno delete oraz delete [] nie wymaga podania typu zmiennej/tablicy do zwolnienia.

#include <iostream>

using namespace std;

int main( )
{
   int *ptr_liczba = new int;
   double *ptr_tablica = new double [3];

   *ptr_liczba= 21;
   ptr_tablica[0] = 0.5;
   ptr_tablica[1] = 1.9;
   ptr_tablica[2] = 4.2;

   cout << "liczba: " << *liczba << endl;
   cout << "tablica[0]: " << tablica[0];
   cout << "tablica[1]: " << tablica[1];
   cout << "tablica[2]: " << tablica[2];
   
   delete liczba;
   delete [] tablica;
   
   return 0;
}

Program najpierw przydziela pamięć dla zmiennej ptr_liczba za pomocą operatora new, a następnie przydziela tablicę trzyelementową typu double dla zmiennej ptr_tablica. Na końcu zwalniamy pamięć stosując odpowiednie operatory. Kolejność wystąpienia operatorów delete nie jest ważna dopóki zmienne nie są ze sobą powiązane.
Ilustruje to następny przykład.

int main( )
{
   int **ptr_tablica = new int*[2];

   ptr_tablica[0] = new int[10];
   ptr_tablica[1] = new int[10];

   delete [] ptr_tablica;
   delete [] ptr_tablica[0];
   delete [] ptr_tablica[1];
}

Powyższy program rezerwuje tablicę wskaźników typu int (tablicę dwuwymiarową). Następnie przydziela pamięć (tablicę) każdemu z wierszy tablicy. Deklaracja taka jest równoważna zadeklarowaniu statycznej tablicy dwuwymiarowej:

int tablica[2][10]

Program jest błędnie napisany gdyż kolejność wywołania operatorów delete[] jest niewłaściwa. W takich przypadkach kolejnoć wywołania jest odwrotna. Program powinien być więc napisany tak:

int main( )
{
   int **ptr_tablica = new int*[2];

   ptr_tablica[0] = new int[10];
   ptr_tablica[1] = new int[10];

   delete [] ptr_tablica[0];
   delete [] ptr_tablica[1];
   delete [] ptr_tablica;
}

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Więcej z Fandomu

Losowa wiki