Alocare/Dealocare memorie

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
stelian_2681
Junior
Junior
Posts: 36
Joined: 24 Jun 2013, 23:25
Judet: Olt

Alocare/Dealocare memorie

Post by stelian_2681 » 14 Jul 2014, 18:51

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



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Alocare/Dealocare memorie

Post by Marius Bancila » 16 Jul 2014, 23:40

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;
}
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

waleed321
Junior
Junior
Posts: 1
Joined: 19 Sep 2014, 15:44
Judet: Bistriţa-Năsăud

Re: Alocare/Dealocare memorie

Post by waleed321 » 19 Sep 2014, 15:51

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 ?
ali

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Alocare/Dealocare memorie

Post by Ovidiu Cucu » 21 Sep 2014, 14:25

waleed321 wrote: Nu am inteles urmatorul cod de ce nu ruleaza ?
Care "urmatorul cod"?

Post Reply