Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 4 odgovora
  • 2.931 pregleda

Najnovija ↓

Oslobađanje dinamički alocirane memorije. 30.12.2008. u 11:06 · pre 217 meseci #1
Kako osloboditi (i dali treba osloboditi) dinamički alociranu memoriju na Stacku ( u funkciji ).
Code:
int* Implement::Find ()
{
    int* row = NULL;
    row = new int [allLines[i].size()];
    int* ptr;
    ptr = row;
    return ptr;
}
void Implement::CreateImage()
{
    int* x;
    x = Find ();
    x[2] = 5;
    delete []x; //dali ovo uništava i *row?
    x = NULL;
}
Re: Oslobađanje dinamički alocirane memorije. 30.12.2008. u 13:14 · pre 217 meseci #2
Mislim da ne uništava *row. Moraš dodati
Code:

delete[] row;


Mada, ne razumem, destruktor će i tako i tako da uništi sve na kraju (ako si ga definisao)
Potpis
"Dont worry about thing, 'cause every lil' thing is gonna be allright" Bob Marley
Re: Oslobađanje dinamički alocirane memorije. 30.12.2008. u 15:18 · pre 217 meseci #3
Nece ga unistiti, treba ti dvostruki pokazivac, tj pokazivac na pokazivac.
A i to mozes vrlo lako sam da proveris.
Samo namesti da ti dinamicka memorija ima nesto vise mesta, recimo 1MB, 2, ili tako nesto pa prati u task manageru kako se zauzima i kako se oslobadja memorija, pre i posle tog zauzimanja ili oslobadjanja samo stavi neki cin ili tako nesto da bi video razliku.
npr namesti niz od double elemenata, trodimenzioni npr. double niz[50][50][50] ipokazivac na njega i radi sa tim pa ces videti da ne oslobadja memoriju

Ja iskreno nisam mnogo radio sa dvostrukim pokazivacima pa ne znam tacno kako treba taj kod da izgleda, ali kontam da f-ja find mora da vraca int**
Re: Oslobađanje dinamički alocirane memorije. 30.12.2008. u 15:59 · pre 217 meseci #4
Code:
//ovo
int* Implement::Find ()
{
    int* row = NULL;
    row = new int [allLines[i].size()];//10
    int* ptr;
    ptr = row;
    return ptr;
}
//ili ovo
int* Implement::Find ()
{
    int row[10];
    int* ptr;
    ptr = row;
    return ptr; //vraćam pokazivać na  pokazivać row ( on pokazuje na row[0] )
}
///ili ovo je jedno te isto
int* Implement::Find ()
{
    int row[10];
    return row; //vraćam pokazivać na prvi element niza
}
void Implement::CreateImage()
{
    int* x;
    x = Find ();
    x[2] = 5;
    delete []x; //ovim nisam uništio niz x, već []row, jer ja nisam alocirao memoriju za x. x samo pokazuje na row. x = ptr = row.
                   //dakle ne treba mi dvostruki delete
    x = NULL;
}

Ili sam sve krivo skontao?
Re: Oslobađanje dinamički alocirane memorije. 30.12.2008. u 19:51 · pre 217 meseci #5
Dobro ti je ono što si napisao u prvom postu. Svejedno je da li vraćaš ptr ili row, jer return i onako vraća kopiju lokalne varijable ptr odnosno row. Da bi proverio kako kod teče probaj
Code:


#include <iostream>

using namespace std;


class My
{
public:

    My()
    {
        cout << "My()" << endl;
    }

    ~My()
    {
        cout << "~My()" << endl;
    }
};


My* f()
{
    My* row = new My[5];
    My* ptr = row;
    return ptr;// (2)
}

int main()
{
    My* r = f();
    delete[] r;// (1)
    return 1;
}

koji će po uništavanju niza objekata pozivati destruktor sa ispisom. Ako isključiš liniju (1) videćes da se destruktori ne pozivaju. Umesto (2) možeš da staviš
Code:

return row;

sve i dalje radi na isti način.
Potpis
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme