Problem z usuwaniem za pomoca delete[]
Ostatnio zmodyfikowano 2019-09-14 16:00
max25 Temat założony przez niniejszego użytkownika |
Problem z usuwaniem za pomoca delete[] » 2019-09-13 22:37:47 Witam wszystkich! Mam problem nie moge usunac dynamicznej tablicy. Probowalem uzyc free() z C czy tez za pomoca delete[] ale wciaz pojawia sie ta sama sytuacja usuwa z tablic tablica[0] i tablica[1] ale dalsze komorki dalej sa poprawne. Podaje kod i prosze o wyjasnienie, bo byc moze cos robie nie tak.
#include <iostream> //#include <memory>
using namespace std;
int main() { int* tab=new int[5];
tab[0]=1; tab[1]=2; tab[2]=3;
cout<<tab[2]<<endl;
delete[] tab;
cout<<tab[2]<<endl;
return 0; }
Z tego co mi sie wydaje powinno usunac wartosc tab[2] i wyrzucac smieci a nie robi tego i dalej pokazuje prawidlowa wartosc 3. |
|
pekfos |
» 2019-09-13 22:48:11 Z tego co mi sie wydaje powinno usunac wartosc tab[2] i wyrzucac smieci a nie robi tego i dalej pokazuje prawidlowa wartosc 3. |
Twoje 3 to śmieci dla tego, kto po Tobie tą pamięć dostanie. Bywa że pamięć jest nadpisywana po zwolnieniu w celach diagnostycznych, ale to nie jest coś na czym powinieneś polegać. Użycie pamięci po zwolnieniu ma niezdefiniowane zachowanie. |
|
max25 Temat założony przez niniejszego użytkownika |
Problem z usuwaniem za pomoca delete[] » 2019-09-13 22:55:12 Dzieki za tak szybka odpowiedz. Czyli nie powinienem martwic sie oto, ze te dane moga mi wyciec, Te dzialanie dzieje sie tez w nastepnych komorkach nie tylko w tab[2]. Powiedz mi czy takie rozwiazanie bedzie bezpieczne do uzywania w programach lub grach i czy napisalem ten kod poprawnie?
Podaje kod
#include <iostream> //#include <memory>
using namespace std;
int main() { int* tab=new int[5];
tab[0]=1; tab[1]=2; tab[2]=3; tab[3]=4;
cout<<tab[2]<<endl;
delete[] tab;
tab[2]=tab[2]+5; //dalej wykonuje na tablicy dzialania.
cout<<tab[2]<<endl;
return 0; }
Czy to normalne ze wylapuje mi prawidlowy wynik mimo ze to smiec? Jesli mozna to jak to naprawic? |
|
pekfos |
» 2019-09-13 23:17:16 Czyli nie powinienem martwic sie oto, ze te dane moga mi wyciec |
Jeśli zwalniasz pamięć, to pamięć nie wycieka. Wyciek danych to zupełnie niezwiązany temat. Jeśli operujesz na wrażliwych informacjach, powinieneś sam zadbać by nie były przechowywane zbyt długo, lub niepotrzebnie. Czy to normalne ze wylapuje mi prawidlowy wynik mimo ze to smiec? Jesli mozna to jak to naprawic? |
Użycie pamięci po jej zwolnieniu ma niezdefiniowane zachowanie. Musisz pamiętać, że błędny program nie musi zawsze działać błędnie. Na tym przykładzie za mało się dzieje, żeby było widać efekty tego typu błędów. W prawdziwej aplikacji pamięć jest nieustanie alokowana i zwalniana. Używając pamięci po jej zwolnieniu ryzykujesz, że używasz pamięci która nie jest już wolna i w efekcie wtykasz kij w szprychy innej części programu. |
|
max25 Temat założony przez niniejszego użytkownika |
Problem z usuwaniem za pomoca delete[] » 2019-09-13 23:30:03 A rozumiem co masz na mysli a co z ponownym uzyciem tablicy dynamicznej np taki kod
#include <iostream> //#include <memory>
using namespace std;
int main() { int* tab=new int[5];
tab[0]=1; tab[1]=2; tab[2]=3; tab[3]=4;
cout<<tab[2]<<endl;
delete[] tab; //zwalniam pamiec
//tab[2]=tab[2]+5;
tab=new int[5]; //ponowne uzycie tablicy
tab[0]=10; tab[1]=20; tab[2]=30; tab[3]=40;
cout<<tab[2]<<endl;
return 0; }
Czy to utworzenie nowej tablicy jest o tej samej nazwie czy tylko nadpisanie starej jak przeciazenie? (Jakby co wciaz czekam na ta ostatnia odpowiedz) |
|
pekfos |
» 2019-09-14 16:00:50 Dynamicznie alokowane tablice nie mają nazw. |
|
« 1 » |