Kurs maturalny z języka angielskiego!
kurs-maturalny-jezyk-angielski

PROGRAMOWANIE I ALGORYTMY

Zajęcia maturalne z informatyki
Olimpiada Informatyczna Juniorów
    Prowadzący: Marcin Kasprowicz
  • właściciel serwisu algorytm.edu.pl
  • wrzesień 2024 — start zajęć
  • czytaj więcej

Operatory "new" i "delete"


Operator "new"

Operator new wykorzystywany jest do przydzielania pamięci dla zmiennych zastosowanych w programie. Zmienne te muszą być wskaźnikami. Pamięć jest alokowana na żądanie z dostępnej puli, którą nazywamy stertą. Możemy to rozumieć w ten sposób, że za pomocą operatora new prosimy system operacyjny, aby udostępnił żądaną ilość pamięci, którą chcemy wykorzystać w programie.

Operator "delete"

Operator delete zwalnia do puli przydzieloną wcześniej pamięć przy pomocy operatora new. Zwolniona pamięć będzie mogła być ponownie wykorzystana.

Przydzielenie i zwolnienie pamięci dla zmiennej typu int

Przykład 1

#include <iostream>
using namespace std;

int main()
{
	//przydzielenie pamięci
	int *a = new int;
	
	/* lub
		int *a;
		a = new int;
	*/
	
	*a = 3;
	cout<<*a; //3
	
	//zwolnienie pamięci
	delete a;
	
	return 0;
}

Przydzielenie i zwolnienie pamięci dla tablicy o n elementach typu int

Przykład 2

#include <iostream>
using namespace std;

int main()
{
	int n;
	
	cout<<"Podaj liczbę elementów tablicy tab: ";
	cin>>n;
	
	//przydzielenie pamięci na n elementów
	int *tab = new int [n];
	
	/* lub
		int *tab;
		tab = new int [n];
	*/
	
	//zwolnienie pamięci
	delete [] tab;
	
	return 0;
}

Przydzielenie i zwolnienie pamięci dla elementu struktury

Przykład 3

#include <iostream>
using namespace std;

struct struktura{
	int a;
	struktura *next;
}*current;

int main()
{
	//przydzielenie pamięci
	current = new struktura;
	current->a = 3;
	
	//wyzerowanie wskaźnika
	current->next = NULL;
	
	cout<<current->a<<endl; //3
	
	//przydzielenie pamięci
	struktura *pom = new struktura;
	
	pom->a = 5;
	
	current->next = pom;
	
	cout<<current->next->a;  //5
	
	//zwolnienie pamięci
	delete pom;
	delete current;
	
	return 0;
}

Zauważ, że po elementach struktury poruszamy się za pomocą operatora "->". Wskaźnik wyzerowujemy, wstawiając wartość NULL.

Przydzielenie i zwolnienie pamięci dla tablicy dwuwymiarowej o różnej liczbie elementów w i-tym wierszu

Przykład 4

Stwórz tablicę dwuwymiarową o różnej liczbie elementów w poszczególnych wierszach. Jako ostatnią wartość każdego wiersza wczytaj liczbę 0. Będzie ona wartownikiem.

#include <iostream>
using namespace std;

int main()
{
	int n, k, **tab;
	cout<<"Podaj liczbę wierszy tablicy dwuwymiarowej: ";
	
	cin>>n;
	
	//przydzielenie pamięci dla n wierszy
	tab = new int *[n];
	
	for(int i=0; i<n; i++)
	{
		cout<<"Podaj liczbę elementów w "<<i+1<<" wierszu: ";
		cin>>k;
		//przydzielenie pamięci na k elementów i-tego wiersza
		tab[i] = new int [k];
		
		cout<<"Wczytaj "<<k<<" elementów do wiersza o indeksie "<<i<<":"endl;
		//wczytanie k elementów do i-tego wiersza (ostatnia wartość to 0)
		for(int j=0; j<k; j++)
			cin>>tab[i][j];
	}
	
	//wypisanie elementów dwuwymiarowej tablicy
	cout<<"Elementy tablicy dwuwymiarowej:\n";
	for(int i=0; i<n; i++)
	{
		int j = 0;
		while(tab[i][j] != 0)
			cout<<tab[i][j++]<<' ';
		cout<<0<<endl;
	}
		
	
	//zwolnienie pamięci dla elementów poszczególnych wierszy
	for(int i=0; i<n; i++)
		delete [] tab[i];
	
	//zwolnienie pamięci przydzielonej na wiersze tablicy
	delete [] *tab;
	return 0;
}

Wejście i wyjście

Podaj liczbę wierszy tablicy dwuwymiarowej: 3
Podaj liczbę elementów w 1 wierszu: 5
Wczytaj 5 elementów do wiersza o indeksie 0:
1 2 3 8 0
Podaj liczbę elementów w 2 wierszu: 7
Wczytaj 7 elementów do wiersza o indeksie 1:
8 7 6 9 8 7 0
Podaj liczbę elementów w 3 wierszu: 5
Wczytaj 5 elementów do wiersza o indeksie 2:
1 2 3 4 0
Elementy tablicy dwuwymiarowej:
1 2 3 8 0
8 7 6 9 8 7 0
1 2 3 4 0