Wyciek pamieci - sprawdzenie kodu

Wyciek pamieci - sprawdzenie kodu
B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
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?

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

}
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
2

A po wypisaniu

Kopiuj
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.

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Temat dotyczy samej funkcji, nie jej wywołaniem.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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);

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

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

B1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
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).

Kopiuj
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;
}
 
} 
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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ć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.