TcB Skrevet 28. november 2004 Del Skrevet 28. november 2004 (endret) Hei jeg lager et matrise regne program, og har et problem med destruktøren når jeg kjører programmet: Konstruktør: template <typename T> Matrix<T>::Matrix(int r, int k) : rad(r), kol(k) { matrix = new T*[rad]; for(int i=0; i<rad; i++) { matrix[i] = new T[kol]; } } Destruktør: template <typename T> Matrix<T>::~Matrix() { for(int i=0; i<rad; i++) { delete[] matrix[i]; } delete[] matrix; } Jeg har noen operator overloadere som ser slik ut: template <typename T> const Matrix<T> Matrix<T>::operator +(Matrix<T>& m) { if(rad != m.getRader() || kol != m.getKol()) { cout << "Feil dimensjon" << endl; return m; } Matrix<T> temp(rad, kol); for(int i=0; i<rad; i++) { for(int j=0; j<kol; j++) { temp.setVerdi(i,j,(matrix[i][j] + m.getVerdi(i,j))); } } return temp; } Jeg vet ikke om dette er den beste måten å gjøre en operator for å plusse 2 matriser... Det som er er at jeg får segmentation fault og når jeg kjører Valgrind får jeg følgende melding: ==1816== Invalid read of size 4 ==1816== at 0x804908D: Matrix<int>::~Matrix() (matrix.cpp:57) ==1816== by 0x8048EBD: main (main.cpp:60) ==1816== Address 0x1BB3D498 is 0 bytes inside a block of size 12 free'd ==1816== at 0x1B9057CC: operator delete[](void*) (vg_replace_malloc.c:162) ==1816== by 0x80490C8: Matrix<int>::~Matrix() (matrix.cpp:59) ==1816== by 0x8049664: Matrix<int>::operator+(Matrix<int>&) (matrix.cpp:82) ==1816== by 0x8048DEC: main (main.cpp:52) ==1816== ==1816== Invalid read of size 4 ==1816== at 0x80490A2: Matrix<int>::~Matrix() (matrix.cpp:57) ==1816== by 0x8048EBD: main (main.cpp:60) ==1816== Address 0x1BB3D498 is 0 bytes inside a block of size 12 free'd ==1816== at 0x1B9057CC: operator delete[](void*) (vg_replace_malloc.c:162) ==1816== by 0x80490C8: Matrix<int>::~Matrix() (matrix.cpp:59) ==1816== by 0x8049664: Matrix<int>::operator+(Matrix<int>&) (matrix.cpp:82) ==1816== by 0x8048DEC: main (main.cpp:52) ==1816== ==1816== Invalid free() / delete / delete[] ==1816== at 0x1B9057CC: operator delete[](void*) (vg_replace_malloc.c:162) ==1816== by 0x80490AC: Matrix<int>::~Matrix() (matrix.cpp:57) ==1816== by 0x8048EBD: main (main.cpp:60) ==1816== Address 0x1BB3D4D8 is 0 bytes inside a block of size 12 free'd ==1816== at 0x1B9057CC: operator delete[](void*) (vg_replace_malloc.c:162) ==1816== by 0x80490AC: Matrix<int>::~Matrix() (matrix.cpp:57) ==1816== by 0x8049664: Matrix<int>::operator+(Matrix<int>&) (matrix.cpp:82) ==1816== by 0x8048DEC: main (main.cpp:52) ==1816== ==1816== Invalid free() / delete / delete[] ==1816== at 0x1B9057CC: operator delete[](void*) (vg_replace_malloc.c:162) ==1816== by 0x80490C8: Matrix<int>::~Matrix() (matrix.cpp:59) ==1816== by 0x8048EBD: main (main.cpp:60) ==1816== Address 0x1BB3D498 is 0 bytes inside a block of size 12 free'd ==1816== at 0x1B9057CC: operator delete[](void*) (vg_replace_malloc.c:162) ==1816== by 0x80490C8: Matrix<int>::~Matrix() (matrix.cpp:59) ==1816== by 0x8049664: Matrix<int>::operator+(Matrix<int>&) (matrix.cpp:82) ==1816== by 0x8048DEC: main (main.cpp:52) Er det noen som klarer å se hva det er som jeg gjør galt? Jeg vil tippe det er kanskje det med at jeg oppretter en temp matrise som jeg returnerer, men isåfall hvordan kan jeg gjøre det annerledes?? Takk for enhver hjelp. Endret 28. november 2004 av TcB Lenke til kommentar
pian Skrevet 28. november 2004 Del Skrevet 28. november 2004 Sliter med samme oblig, men jeg får ikke engang kalt dtor'en :S Koden din er til forveksling lik min, så det ser lovende ut. Men koden på get-metodene dine har du ikke tatt med, kanskje det er noe med templaten der. Jeg lurte også på å prøve med en virtuell destruktør, kanskje det kan være en ide for deg også? Lykke til, både med oblig og eksamen på fredag! Lenke til kommentar
A_N_K Skrevet 28. november 2004 Del Skrevet 28. november 2004 Ser ut som du sliter med et typisk problem i C++ hvor et objekt opprettes som en kopi av et annet, men overtar ikke eierskapet til dynamisk opprettet minne. Det vil si at når du returnerer den midlertidige matrisen temp oprettes det en kopi med pekere til samme dynamisk allokerte minne, men når temp går av stakken destrueres dette minnet og den returnerte kopien refererer til ugyldig minne. Kanskje en bedre idé å bruke std::vector istedenfor "skallede" pekere? Lenke til kommentar
TcB Skrevet 28. november 2004 Forfatter Del Skrevet 28. november 2004 Kanskje en bedre idé å bruke std::vector istedenfor "skallede" pekere? Det er en obligatorisk oppgave hvor vi må bruke pekere Men jeg fant ut hva jeg hadde gjort galt og det var at copy constructor var feil, og hadde glemt litt const her og der. Men takk allikevel Lykke til pain, med både oppgave og eksamen Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå