Wyciek pamieci - sprawdzenie kodu

0

Mam pytanie. Ponizszy kod jest tylko przykladem , nie bierzcie pod uwage jego logicznemu zastosowaniu. Czy rekurencyjnie wywolana funkcja w ktorej dynamicznie tworzy sie tablice a nastepnie zwalnia ta przekazana w argumencie spowoduje jakis wyciek pamieci , albo naruszenie ochrony pamieci?

int** fun(int **tab){
    if(tab[0][0]==0) return tab;
    int **tab2;
    tab2=new int*[1];
    tab2[0]=new int[1];
    tab[0][0]=tab[0][0]/2;
    tab2[0][0]=tab[0][0];
    delete [] tab[0];
    delete [] tab;
    fun(tab2);

int main()
{
    int **tab=new int*[1];
    tab[0]=new int[1];
    tab[0][0]=10;
    int **wynikowa;
    wynikowa=fun(tab);
    cout << wynikowa[0][0];
    return 0;
}

}
2

A po wypisaniu

cout << wynikowa[0][0]; <

co usunie wynikowa?

Poza tym taki kod to po prostu wystawienie twarzy i proszenie się o policzek. Nawet jak teraz nie wycieka to za jakiś czas, przy jakiejś modyfikacji, będzie.

0

Temat dotyczy samej funkcji, nie jej wywołaniem.

0

No ale o samej funkcji pisze przecież @twonek...
Może wskażę jaśniej: skąd wiesz czy zwolnić z pamięci wskaźnik wynikowa czy nie?
Edit: oczywiście zakładam, że tam powinno być return fun(tab2);

0

Tak masz wyciek pamięci. Ostatnia tworzona (z przedostatniej rekurencji) tablica nie jest usuwana.

0

A jak powinna wygladać funkcja by nie było wycieku pamieci? (dodam, ze chodzi mi tylko o funkcje, zdaje sobie sprawy ze w mainie nie zwolnilem zaalokowanej pamieci).

int** fun(int **tab){
    if(tab[0][0]==0) return tab;
    int **tab2;
    tab2=new int*[1];
    tab2[0]=new int[1];
    tab[0][0]=tab[0][0]/2;
    tab2[0][0]=tab[0][0];
    delete [] tab[0];
    delete [] tab;
    fun(tab2);
 
int main()
{
    int **tab=new int*[1];
    tab[0]=new int[1];
    tab[0][0]=10;
    int **wynikowa;
    wynikowa=fun(tab);
    cout << wynikowa[0][0];
    delete [] wynikowa[0];
    delete [] wynikowa;
    return 0;
}
 
} 
0

twój problem polega na tym, że robisz przykazywanie własności w ramach rekurencji.

Opisz swój pierwotny problem, bo to co napisałeś jest strasznie pokraczne i prosisz by naprawić coś czego nie powinno się naprawiać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1