Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z usuwaniem za pomoca delete[]

Ostatnio zmodyfikowano 2019-09-14 16:00
Autor Wiadomość
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.
P-175195
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.
P-175196
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?
P-175197
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.
P-175198
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)
P-175199
pekfos
» 2019-09-14 16:00:50
Dynamicznie alokowane tablice nie mają nazw.
P-175200
« 1 »
  Strona 1 z 1