Page 1 of 1

Alocare/Dealocare memorie

Posted: 14 Jul 2014, 18:51
by stelian_2681
In codul de mai jos este alocata memorie pentru un vector.
La finalul codului am afisat elementele vectorului inainte de a fi dealocata memoria si apoi am afisat din nou elementele vectorului dupa dealocarea memoriei,insa
imi este afisat ultimul element din vector desi dealocarea memoriei este facuta corect.
In mod normal codul ar fi trebuit sa afiseseze "garbage" pentru toate elementele vectorului, dar numai la ultimul element este afisat elementul introdus de la tastatura.
Intrebare: Cum se poate verifica daca dealocarea memoriei s-a facut corect ?

Code: Select all

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int n;
    cout << "\n Dati dimensiunea vectorului : ";
    cin >>n;
    cout << "\n Introduceti elementele vectorului : "<<endl;
    int *p = (int*)malloc(n * sizeof(int));
    for (int i=0; i<n; i++)
    {
        cout << "\n A["<<i<<"] = ";
        cin >> *(p+i);
    }
    cout << "\n Elementele vectorului sunt : ";
    for (int i=0; i<n; i++)
        cout <<" "<<*(p+i);
    cout << endl;
    free(p);
    cout << endl;
    for (int i=0; i<n; i++)
        cout << " " << *(p+i);
    cout << endl;
    return 0;
}

Re: Alocare/Dealocare memorie

Posted: 16 Jul 2014, 23:40
by Marius Bancila
Folosirea unei zone de memory dezalocate cu free implica comportament nedefinit. Astea inseamna ca datele pot fi acolo, sau pot sa fi disparut, sau aplicatia ta poate sa se inchida instant sau toate exceptiile din firewall-ul tau sa fie sterse. Poate fi orice.

Free nu e obligat sa faca nimic altceva decat sa returneze memoria alocatorului, astfel incat sa poata fi folosita din nou. E un detaliu de implementare daca memoria ramana neatinsa, daca e suprascrisa cu ceva (de exemplu zerouri), etc. E posibil ca intr-o configuratie de debug sa se intample ceva, iar in una de release altceva.

In alta ordine de idei, nu inteleg de ce folosesti malloc() si free() in C++. Ar trebui sa folosesti operatorii new/new[] si delete/delete[].

Pe de alta parte nici nu e necesar sa aloci si eliberezi memorie explicit. Programul tau poate fi mult simplificat daca folosesti un std::vector<int>.

Code: Select all

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    cout << "\n Dati dimensiunea vectorului : ";
    cin >>n;
    cout << "\n Introduceti elementele vectorului : "<<endl;
    vector<int> p;
    for (int i=0; i<n; i++)
    {
        cout << "\n A["<<i<<"] = ";
        int x;
        cin >> x;
        p.push_back(x);
    }

    cout << "\n Elementele vectorului sunt : ";
    for (int i=0; i<n; i++)
        cout <<" "<< p[i];
    cout << endl;

    return 0;
}

Re: Alocare/Dealocare memorie

Posted: 19 Sep 2014, 15:51
by waleed321
Va salut !
Nu am inteles urmatorul cod de ce nu ruleaza ?
Ar trebui ca acest cod sa afiseze initialele numelui introdus de la tastatura.
Unde gresesc ?

Re: Alocare/Dealocare memorie

Posted: 21 Sep 2014, 14:25
by Ovidiu Cucu
waleed321 wrote: Nu am inteles urmatorul cod de ce nu ruleaza ?
Care "urmatorul cod"?