Hallo,
Sinds kort volg ik uit interesse een vak over Computer Graphics. Voor een opdracht moet ik een programma schrijven met Qt waarin een bol, een pyramide en een kubus voorkomen. Het idee is om in plaats van glTranslate, glRotate etc een eigen math library te gebruiken.
Ik heb ervoor gekozen een Matrix class te maken die in de math library gebruikt wordt. Deze class bevat een 1dimensionale array die op de heap geallocate wordt. Door de haakjes () te overloaden wordt het gebruiksgemak van 2dimensionale arrays verkregen. Stel dat we een Matrix genaamd 'mat' hebben, dan kan je bijvoorbeeld schrijven 'mat(1,2) = 31;' om maar wat te noemen. Dit maakt het schrijven van functies voor bijvoorbeeld de inverse van een matrix een stuk makkelijker.
Het programma is gecompiled met gcc 4.4.1 en Qt 4.5 in ubuntu 9.10. Er worden geen foutmeldingen gegeven tijdens het compilen. Via de IDE Eclipse heb ik een debug gedaan. In een van de functies van de math library wordt een Matrix object op de stack aangemaakt. De debugger blijft net hangen na deze functie en het programma crasht. Als het object buiten de scope valt wanneer de functie verlaten wordt, dan wordt de destructor zoals verwacht aangeroepen lijkt het. Dan crasht het programma met de volgende melding: " *** glibc detected *** double free or corruption (fasttop)". Het vrijmaken van de 'heap allocated array' van het Matrix object in de destructor is toch wel echt essentieel. Als ik de destructor van de class Matrix leeg laat dan draait het programma prima, maar is er een fors geheugenlek zoals verwacht. Ik heb de Matrix class hieronder weergegeven samen met een screenshot van de Eclipse debugger waarin het probleem ook naar voren komt.
Kunnen jullie me misschien vertellen wat ik fout doe ? Ik ben nog niet zo lang met C++ bezig dus misschien zie ik wat over het hoofd. Het probleem zit hem in dit deel van de code, omdat als ik de destructor leegmaak er geen enkel probleem is (behalve de memory leak dan).
mvg, Bram
Sinds kort volg ik uit interesse een vak over Computer Graphics. Voor een opdracht moet ik een programma schrijven met Qt waarin een bol, een pyramide en een kubus voorkomen. Het idee is om in plaats van glTranslate, glRotate etc een eigen math library te gebruiken.
Ik heb ervoor gekozen een Matrix class te maken die in de math library gebruikt wordt. Deze class bevat een 1dimensionale array die op de heap geallocate wordt. Door de haakjes () te overloaden wordt het gebruiksgemak van 2dimensionale arrays verkregen. Stel dat we een Matrix genaamd 'mat' hebben, dan kan je bijvoorbeeld schrijven 'mat(1,2) = 31;' om maar wat te noemen. Dit maakt het schrijven van functies voor bijvoorbeeld de inverse van een matrix een stuk makkelijker.
Het programma is gecompiled met gcc 4.4.1 en Qt 4.5 in ubuntu 9.10. Er worden geen foutmeldingen gegeven tijdens het compilen. Via de IDE Eclipse heb ik een debug gedaan. In een van de functies van de math library wordt een Matrix object op de stack aangemaakt. De debugger blijft net hangen na deze functie en het programma crasht. Als het object buiten de scope valt wanneer de functie verlaten wordt, dan wordt de destructor zoals verwacht aangeroepen lijkt het. Dan crasht het programma met de volgende melding: " *** glibc detected *** double free or corruption (fasttop)". Het vrijmaken van de 'heap allocated array' van het Matrix object in de destructor is toch wel echt essentieel. Als ik de destructor van de class Matrix leeg laat dan draait het programma prima, maar is er een fors geheugenlek zoals verwacht. Ik heb de Matrix class hieronder weergegeven samen met een screenshot van de Eclipse debugger waarin het probleem ook naar voren komt.
Kunnen jullie me misschien vertellen wat ik fout doe ? Ik ben nog niet zo lang met C++ bezig dus misschien zie ik wat over het hoofd. Het probleem zit hem in dit deel van de code, omdat als ik de destructor leegmaak er geen enkel probleem is (behalve de memory leak dan).
mvg, Bram
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| template <class T> class Matrix { public: T* data; //the only reason that it is public is that it can be loaded into glLoadMatrix. Matrix(unsigned r, unsigned c) { rows = r; cols = c; data = new T[rows * cols]; } ~Matrix() { delete[] data; // to prevent memory leak } T& operator() (unsigned i, unsigned j) { return data[i + rows * j]; //internally represent [i][j] as [j][i] when flattening 2D array into 1D array because glLoadMatrix loads column after column instead of row after row } T operator() (unsigned i, unsigned j) const { return data[i + rows * j]; } void loadIdentity(){ //assuming square matrix for (unsigned i = 0; i < rows; i++){ for (unsigned j = 0; j < cols; j++){ if (i != j) { data[j*rows + i] = 0; } else { data[j*rows + i] = 1; } } } } private: unsigned rows, cols; }; |
