Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem ze zwolnieniem pamięci za pomocą delete

Ostatnio zmodyfikowano 2016-03-06 18:27
Autor Wiadomość
Jasiu1047
Temat założony przez niniejszego użytkownika
Problem ze zwolnieniem pamięci za pomocą delete
» 2016-03-06 03:26:17
Dzień dobry!
Mam problem ze zwolnieniem pamięci w funkcji long int fib w programie. Zwolnienie pamięci dotyczy tablicy tab[n]. Ogólnie program ma liczyć sume parzystych i nie parzystych wyrazów ciągu Fibonacciego. Problem polega na tym, iż podczas pracy programu funkcja fib(), moim zdaniem zwalnia tablice, z której korzysta w kolejnym wykonaniu. Program po prostu przestaje działać po wykonaniu operacji na początkowych małych wyrazach ciągu. Byłbym bardzo wdzięczny za jakiekolwiek wskazówki jak poradzić sobie z tym problemem.
C/C++
#include <iostream>
#include <stdio.h>
using namespace std;

long int fib( int n )
{
    long int * tab;
    tab = new long int[ n ];
    tab[ 0 ] = 0;
    tab[ 1 ] = 1;
    tab[ 2 ] = 1;
    for( int i = 3; i <= n; i++ )
    {
        tab[ i ] = tab[ i - 1 ] + tab[ i - 2 ];
    }
    delete[] tab;
    return tab[ n ];
   
}




int main()
{
    cout << "Hello world!" << endl;
    int n, sumap = 0, suman = 0;
   
    do {
       
        cout << "Podaj numer ciagu od 1 do 100" << endl;
        cin >> n;
       
       
        cout << fib( n ) << endl;
        if( fib( n ) % 2 == 0 )
        {
            sumap += fib( n );
            cout << "Suma parzystych: " << sumap << endl;
            cout << "Suma nie parzystych: " << suman << endl;
        }
        else
        {
            suman += fib( n );
            cout << "Suma parzystych: " << sumap << endl;
            cout << "Suma nie parzystych: " << suman << endl;
        }
       
    } while( n > 0 && n < 100 );
   
   
   
   
    getchar(); getchar();
    return 0;
}
P-145602
mateczek
» 2016-03-06 04:29:08
C/C++
long int fib( int n )
{
    long int * tab;
    tab = new long int[ n + 1 ]; // musi być o jeden więcej niż w pętli for używasz operatora <=
    tab[ 0 ] = 0;
    tab[ 1 ] = 1;
    tab[ 2 ] = 1;
    for( int i = 3; i <= n; i++ )
    {
        tab[ i ] = tab[ i - 1 ] + tab[ i - 2 ];
    }
    long int temp = tab[ n ]; // zdajesz sobie sprawę, że funkcja zwróci po prostu n-ty(ostatni) wyraz ciągu??
    delete[] tab; // po zwolnieniu tablicy nie możesz się do niej odwołać
    //return tab[n] // niezbyt legalne rozwiązanie. Zwraca ostatni wyraz nieistniejącego ciągu
    return temp;
   
}

Ogólnie w jaki sposób program ma policzyć sumę wyrazów ciągu to nie wiem. Funkcja zwraca ostatni wyraz ciągu a nie sumę.
P-145603
carlosmay
» 2016-03-06 10:13:58
Problem polega na tym, iż podczas pracy programu funkcja fib(), moim zdaniem zwalnia tablice, z której korzysta w kolejnym wykonaniu.
Ano zwalnia. Rozwiązaniem jest zwrócenie wskaźnika na tą tablicę.
Zwolnienie pamięci wykonaj gdy już nie będzie potrzebna.
P-145607
mateczek
» 2016-03-06 18:27:49
może tak?? W końcu aby policzyć sumę elementów, czy ostatni element ciągu nie potrzeba wcale tablicy ??
C/C++
#include <iostream>

using namespace std;


struct _fib {
    int lastElement;
    long long suma_n;
    long long suma_p;
};

_fib fib( int rozmiar ) {
    _fib temp;
    int n_2 = 0, n_1 = 1, n_0;
    temp.suma_n = 1;
    temp.suma_p = 0;
    for( int i = 2; i < rozmiar; i++ ) {
        n_0 = n_2 + n_1; // obliczanie elemntu ciągu element(n-1)+ element(n-2)
        n_2 = n_1; //przesówamy element n-1 na n-2;
        n_1 = n_0; // przesówamy element n na n-1;
        if( n_0 % 2 == 0 ) temp.suma_p += n_0; //test czy nowo policzony element ciągu parzysty
        else temp.suma_n += n_0;
       
    }
    temp.lastElement = n_0;
    return temp;
}


int main()
{
    int rozmiar;
    cin >> rozmiar;
    _fib ciag = fib( rozmiar );
   
    cout << "suma parzystych elementow = " << ciag.suma_p << endl;
    cout << "suma nieparzystych elementow = " << ciag.suma_n << endl;
    cout << "element ostatni = " << ciag.lastElement << endl;
}
P-145644
« 1 »
  Strona 1 z 1