Witajcie, mam problem z dynamiczną alokacją pamięci, a w szczególności z jej zwolnieniem. W funkcji pop() tworzę dynamicznie nową tablicę i przepisuję do niej wartości z tablicy głównej kolejki, oprócz tego, który został usunięty. Później do głównej tablicy podstawiam wskaźnik do tej nowej, ale gubię wskaźnik do pierwotnej tablicy bez zwolnienia pamięci. Próbowałem użyć operatora delete tuż przed linią tablica=z , ale kompilator (VS 2012) rzuca błędem.
Tutaj kod:
#include <iostream>
#include <Windows.h>
using namespace std;
int rozmiar = 4;
int *tablica = new int[rozmiar];
int ile=0;
void wyswietl(){
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),10);
cout<<endl;
cout<<"-----------------"<<endl;
cout<<"ZAWARTOSC KOLEJKI"<<endl;
cout<<"-----------------"<<endl;
if(ile==0) cout<<"pusta"<<endl;
else{
for(int i=0;i<ile;i++) {
cout<<tablica[i]<<" ";
}
}
cout<<endl;
cout<<"-----------------"<<endl;
}
void push(){
cout<<"Podaj liczbę do wstawienia: ";
int x;
cin>>x;
if(ile<rozmiar){
tablica[ile]=x;
ile++;
}
else if(ile>=rozmiar){
rozmiar=2*rozmiar;
tablica[ile]=x;
ile++;
}
}
void pop(){
if(ile==0){
cout<<"Brak elementów w kolejce";
}
else{
cout<<"Wyjęty element, to: "<<tablica[0];
ile--;
int *z = new int[rozmiar];
for(int i=1;i<=ile;i++)z[i-1]=tablica[i];
tablica=z;
}
Sleep(2000);
}
int main(){
int obsluga=0;
do{
wyswietl();
cout<<"1-push, 2-pop,3-liczba elementow, 4-zakoncz"<<endl;
cin>>obsluga;
switch(obsluga){
case 1: push();
break;
case 2:pop();
break;
case 3:{
cout<<"Liczba elementow: "<<ile<<endl;
Sleep(2000);
}
}
}while(obsluga!=4);
delete [] tablica;
return 0;
}