Witam wszystkich, przychodzę do Was z problemem dot. zwalniania pamięci. Mianowicie przedstawię Wam dwa kody zawierające funkcję zwracającą adres tablicy elementów parzystych z tablicy przekazanej do funkcji jako argument.
Kody różnią się jedną linijką - 1) zwalnia zaalokowaną dynamicznie pamięć, natomiast 2) nie. Przy sprawdzaniu finalnej tablicy elementów parzystych dla kodu 1) widoczne są błędy, dla kodu 2) wartości są prawidłowe.
Jak powinien wyglądać poprawny kod dla wariantu 1)?
1)
#include <iostream>
using namespace std;
int *funkcja(int *poczatek, int *koniec, int &ile){
ile=0;
int rozmiar=0;
int *tablica=NULL;
while(poczatek<=koniec){
if(*poczatek%2==0){
ile++;
int *robocza= new int[rozmiar+1];
for(int i=0;i<rozmiar;i++){
*(robocza+i)=*(tablica+i);
}
*(robocza+rozmiar)=*(poczatek);
/* for(int i=0;i<ile;i++){
cout<<"R:"<<*(robocza+i)<<" ";
}
cout<<endl; */
tablica=robocza;
delete[] robocza;
rozmiar++;
/*for(int i=0;i<ile;i++){
cout<<"T:"<<*(tablica+i)<<" ";
}
cout<<endl; */
}
poczatek++;
}
for(int i=0;i<ile;i++){
cout<<*(tablica+i)<<" ";
}
cout<<endl;
return tablica;
}
int main()
{
int tab[]={2,4,3,8,10,12};
int *pocz=tab;
int *kon=&tab[5];
int ile=0;
cout<<funkcja(pocz,kon,ile);
}
Wynik:
2)
#include <iostream>
using namespace std;
int *funkcja(int *poczatek, int *koniec, int &ile){
ile=0;
int rozmiar=0;
int *tablica=NULL;
while(poczatek<=koniec){
if(*poczatek%2==0){
ile++;
int *robocza= new int[rozmiar+1];
for(int i=0;i<rozmiar;i++){
*(robocza+i)=*(tablica+i);
}
*(robocza+rozmiar)=*(poczatek);
/* for(int i=0;i<ile;i++){
cout<<"R:"<<*(robocza+i)<<" ";
}
cout<<endl; */
tablica=robocza;
rozmiar++;
/*for(int i=0;i<ile;i++){
cout<<"T:"<<*(tablica+i)<<" ";
}
cout<<endl; */
}
poczatek++;
}
for(int i=0;i<ile;i++){
cout<<*(tablica+i)<<" ";
}
cout<<endl;
return tablica;
}
int main()
{
int tab[]={2,4,3,8,10,12};
int *pocz=tab;
int *kon=&tab[5];
int ile=0;
cout<<funkcja(pocz,kon,ile);
}
Wynik:
Jak widać w wynikach, początkowe wartości w kodzie 1) pochodzą z niewiadomego źródła.
Z góry dziękuję za wyjaśnienia! :)