[ Ice-D @ 30.12.2008. 10:06 ] @
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;
}
[ Helionprime @ 30.12.2008. 12:14 ] @
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)
[ Wajda.W @ 30.12.2008. 14:18 ] @
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**
[ Ice-D @ 30.12.2008. 14:59 ] @
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?
[ karas @ 30.12.2008. 18:51 ] @
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.