Usiłuję napisać klasę, reprezentującą macierz. Mam przy tym użyć zliczania referencji (w skrócie: zamiast trzymać w pamięci wiele takich samych obiektów trzymam jeden, a poszczególne macierze mają tylko odwołania do niego).
Zadanie prawie wykonałem, jednak moja klasa "wyszła" dosyć zagmatwana i w wyniku tego po przeskanowaniu valgrindem otrzymuje wyciek pamieci i pewne inne errory. Poniżej zamieszczam jedynie część (całość wyszła mi trochę długa) w której moim zdaniem znajdują się pewne błędy...
int main(){
cout<<"Testujemy mnozenie:"<<endl;
cout<<"Mnozna po mnozeniu:\n"<<first<<endl;
double**ptr5=generateData(3,3,2.1);
Matrix third(3,3,ptr5);
Matrix fourth(3,3,ptr5);
//// cout<<"Mnozna:\n"<<third<<"\nMnoznik:"<<fourth<<endl;
fourth*=third; // komentujac i odkomentowujac zyskuje efekt wycieku-braku...
cout<<"Wynik po mnozezniu:"<<endl;
cout<<fourth<<endl;//wynik zdaje sie wychodzic ok problemem jest chyba tylko pamiec
freeData(2,3,ptr5);
}
Poniżej zapis z valgrinda:
Ukryta treść:
Invalid read of size 4
==16059== at 0x401B1A: Matrix::~Matrix() (in /home/user/Pulpit/Matrix)
==16059== by 0x402CC6: main (in /home/user/Pulpit/Matrix)
==16059== Address 0x5a208a8 is 8 bytes inside a block of size 24 free'd
==16059== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16059== by 0x401B4A: Matrix::~Matrix() (in /home/user/Pulpit/Matrix)
==16059== by 0x402CA8: main (in /home/user/Pulpit/Matrix)
==16059==
==16059== Invalid write of size 4
==16059== at 0x401B20: Matrix::~Matrix() (in /home/user/Pulpit/Matrix)
==16059== by 0x402CC6: main (in /home/user/Pulpit/Matrix)
==16059== Address 0x5a208a8 is 8 bytes inside a block of size 24 free'd
==16059== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16059== by 0x401B4A: Matrix::~Matrix() (in /home/user/Pulpit/Matrix)
==16059== by 0x402CA8: main (in /home/user/Pulpit/Matrix)
==16059==
==16059== Invalid read of size 4
==16059== at 0x401B23: Matrix::~Matrix() (in /home/user/Pulpit/Matrix)
==16059== by 0x402CC6: main (in /home/user/Pulpit/Matrix)
==16059== Address 0x5a208a8 is 8 bytes inside a block of size 24 free'd
==16059== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16059== by 0x401B4A: Matrix::~Matrix() (in /home/user/Pulpit/Matrix)
==16059== by 0x402CA8: main (in /home/user/Pulpit/Matrix)
==16059==
==16059==
==16059== HEAP SUMMARY:
==16059== in use at exit: 24 bytes in 1 blocks
==16059== total heap usage: 62 allocs, 61 frees, 18,772 bytes allocated
==16059==
==16059== LEAK SUMMARY:
==16059== definitely lost: 24 bytes in 1 blocks
==16059== indirectly lost: 0 bytes in 0 blocks
==16059== possibly lost: 0 bytes in 0 blocks
==16059== still reachable: 0 bytes in 0 blocks
==16059== suppressed: 0 bytes in 0 blocks
==16059== Rerun with --leak-check=full to see details of leaked memory
Wydaje mi się że zawarłem wszystko co potrzeba, jeżeli czegoś tutaj nie to dokleję... Dzięki z góry za wszelką pomoc bo jakoś sporo już nad tym siedzę, kod stał się nieczytelny (jest "trochę" większy niż ten wyżej ) i nie mam pojęcia już co jest dobrze, a co źle... Na razie chcę spróbować doprowadzić go do działania (w sensie wycieków) a porządkami zajmę się później
BTW. Tak, wiem że dostęp do tej tablicy to potworek... i już przekonałem się, że jest on "błędogenny" ale poprawie to po znalezieniu tego wycieku
Nie wiem czy rozwiązałeś już problem (przyznaję się że nie analizowałem za bardzo kodu), ale polecam skorzystać z debuggera. Stawiasz marker na linii w której podejrzewasz że Ci się wysypuje oraz bezpośrednio za nią. W między czasie możesz podglądać "online" jak Ci się zmieniają wartości i adresy stałych/zmiennych itp. To będziesz widział wtedy czy i jak Ci skoczy z jednego breakpoint-a do drugiego i czy faktycznie tam się źle dzieje. Valgrind to chyba ostateczne rozwiązanie, jako że nie jest natywnym programem w C++.