Usuwanie dwuwymiarowej tablicy dynamicznej

Odpowiedz Nowy wątek
2017-03-06 01:02
0

Cześć!
Proszę o pomoc gdyż mam problem z usuwaniem tablicy dynamicznej.
Męczę się z zadaniem które opisywałem tutaj: Znajdowanie permutacji drzewa
Tworzę dwuwymiarową tablice char na potrzeby zadania i na końcu funkcji main chcę ją usunąć. Niestety program wywala sie wyświetlająć coś takiego: Error in `/home/wazxse5/Programowanie/codeblocks/MTlab01/bin/Debug/MTlab01': free(): invalid next size (fast): 0x0000000000ec5580 itd.
Debugowałem dla n=3 i t=4 i wtedy wywalało się przy 8 obrocie pętli (pętla powinna się wykonać 22 razy). Natomiast dla n=2 i t=3 wszystko działa ok.
Cały kod jest tu: https://4programmers.net/Pastebin/6429
natomiast to co istotne jest w funkcji main którą wrzucam tutaj:

 int main()
{
    int n, t;
    cout<<"n: "; cin>>n;
    cout<<"t: "; cin>>t;
    int nboftr = numberOfTrees(n, t);

    char** TAB = new char * [nboftr];
    for(int i=0; i<nboftr; i++)
    {
        TAB[i] = new char [n*t];
    }
    ///
    tree(n, t, TAB); // algorytm do zadania
    ///
    cout<<endl;
    for(int i=0; i<nboftr; i++)
    {
        cout<<i+1<<". "<<TAB[i]<<endl;
    }

    for(int i=0; i<nboftr; i++)
    {
        delete [] TAB[i];
    }
    delete [] TAB;

    return 0;
}

Będę bardzo wdzięczny za pomoc :)

Pozostało 580 znaków

2017-03-06 01:16
1

Może jednak vector? ;p

Pozostało 580 znaków

2017-03-06 08:40
1

Spróbuj wykonac to bez użycia findrchar... Bo obawiam się, że tam zwracanie -1 może powodowac nadpisywanie czegoś...


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2017-03-06 10:50
1
if(j%t==0) TAB[0][j]='1';

Z powyższego wnioskuję, że 1 może być zapisane w tablicy pod indeksem 0.

TAB[i][rone-1]='1';

Wtedy powyższe zapisuje 1 pod indeksem -1 a więc poza dostępnym zakresem. Nadpisywane są dane alokatora i stąd błąd podczas zwalniania pamięci.

Pozostało 580 znaków

2017-03-06 12:16
0

Kaczus i Pebal chyba macie rację. Nie rozumiem tylko dlaczego program wywala się dopiero przy zwalnianiu pamięci, a nie wtedy gdy nadpisuję poza zakresem. Dlaczego tak jest?

Dlatego, że nadpisujesz dane potrzebne do prawidłowego zwolnienia pamięci. - Pebal 2017-03-06 12:25

Pozostało 580 znaków

2017-03-06 17:20
;/
0

Wywala sie wtedy kiedy te dane które nadpisałeś są potrzebne i ktoś je czyta. Całkiem możliwe, że rozmiar tablicy zaalokowanej przez new[] w Twoim przypadku znajduje sie zaraz przed tą tablicą w pamięci - tak często bywa. Ty to miejsce nadpisałeś, free chciało to przeczytać i stąd błąd.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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