• 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
50 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 (105,860 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 (105,860 p.)
  1. tak
  2. tak

Podobne pytania

+1 głos
2 odpowiedzi 269 wizyt
pytanie zadane 16 września 2018 w C i C++ przez k4to Początkujący (310 p.)
0 głosów
3 odpowiedzi 185 wizyt
pytanie zadane 5 października 2017 w C i C++ przez hitem Początkujący (300 p.)
0 głosów
1 odpowiedź 68 wizyt
pytanie zadane 11 lipca w PHP, Symfony, Zend przez mi-20 Stary wyjadacz (10,380 p.)
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

65,676 zapytań

112,314 odpowiedzi

237,031 komentarzy

46,653 pasjonatów

Przeglądających: 98
Pasjonatów: 2 Gości: 96

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.

...