• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

zwalnianie zaalokowanej pamięci (delete [])

0 głosów
49 wizyt
pytanie zadane 31 grudnia 2018 w C i C++ przez SeekingAnswers Nowicjusz (140 p.)

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! :)

1 odpowiedź

+1 głos
odpowiedź 31 grudnia 2018 przez j23 VIP (100,480 p.)
tablica = robocza;
delete[] robocza;
...

return tablica;

tablica i robocza po wykonaniu delete będą wskazywać na ten sam zwolniony blok pamięci, dlatego masz dziwne wartości.

 

Tak zrób:

	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];
			}

			delete[] tablica;
			tablica = robocza;

			robocza[rozmiar++] = *poczatek;
		}

		++poczatek;
	}

 

komentarz 31 grudnia 2018 przez SeekingAnswers Nowicjusz (140 p.)

Dziękuję serdecznie za odpowiedź. Rozumiem, że linia kodu:

robocza[rozmiar++] = *poczatek;

może być zastąpiona poprzez:

tablica[rozmiar++] = *poczatek;

gdyż obydwa wskaźniki wskazują na ten sam blok pamięci, a zwracamy 

return tablica;

bo ten wskaźnik jest globalnie zadeklarowany.

1
komentarz 31 grudnia 2018 przez j23 VIP (100,480 p.)
  1. tak
  2. tak

Podobne pytania

+1 głos
2 odpowiedzi 255 wizyt
pytanie zadane 16 września 2018 w C i C++ przez k4to Początkujący (260 p.)
0 głosów
3 odpowiedzi 181 wizyt
pytanie zadane 5 października 2017 w C i C++ przez hitem Początkujący (300 p.)
0 głosów
1 odpowiedź 57 wizyt
pytanie zadane 8 marca w C i C++ przez Grzegorz Szwarc Początkujący (320 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

63,304 zapytań

109,563 odpowiedzi

228,872 komentarzy

43,895 pasjonatów

Przeglądających: 177
Pasjonatów: 9 Gości: 168

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...