Seuraava luokka aiheuttaa ongelmia...
class object { private: vector<triangle> triangles; int triAmount,quadAmount; vector<quad> quads; vec3 pos; public: object(){pos.x=pos.y=pos.z=triAmount=quadAmount=0;} object& operator=(const object &o) { triangles.clear(); quads.clear(); triAmount=o.triAmount; quadAmount=o.quadAmount; triangles.assign(o.triangles.begin(),o.triangles.end()); quads.assign(o.quads.begin(),o.quads.end()); return *this; } object& operator+=(const object &o) { triangles.assign(o.triangles.begin(),o.triangles.end()); quads.assign(o.quads.begin(),o.quads.end()); triAmount+=o.triAmount; quadAmount+=o.quadAmount; return *this; } object& operator+=(const triangle &tr) { triAmount++; triangles.resize(triAmount); triangles[triAmount-1]=tr; return *this; } object& operator*=(const matrix3 &m) { int x; for (x=0; x<triAmount; x++) { (triangles[x])-=pos; (triangles[x])*=m; (triangles[x])+=pos; } return *this; } ~object(){triangles.erase(triangles.begin(),triangles.end());} };
...jos käyttää *= -operaattoria. Kun ohjelma sulkeutuu, tulee "Ohjelma lakkasi toimimasta" -viesti. Jos ohjelmaa debuggaa, tulee "access violation" -ikkuna.
Triangle ja quad ovat luokkia, jotka eivät sisällä dynaamista muistia käyttäviä jäsenmuuttujia ja toimivat niin kuin pitääkin. Kaikki niiden koodissa käytetyt operaattorit on määritelty ja testattu.
Ohjelma kaatuu vasta kun object tuhotaan.
Eikös triAmountin
ja quadAmountin
tilalla kävisi ihan hyvin triangles.size()
ja quads.size()
? Ja täytyykö dtorissa tyhjätä trianglesia erikseen, miksei vektorin oma dtor käy? Tai vector.clear()
.
triAmount++; triangles.resize(triAmount); triangles[triAmount-1]=tr;
näyttää purkalta, voisi korvata triangles.push_back(tr)
. Ja toimiiko tuo object& operator+=(const object &o)
? vector.assign()
tuhoaa vektorin vanhan sisällön, mutta tri/quadAmountia kasvatetaan.
// jos objektiin lisätty +=:lla muita objekteja, // triAmount näyttää mitä sattuu for (x=0; x<triAmount; x++) { (triangles[x])-=pos; // vektorin indeksoija ei tarkista rajoja -> PAM, ylivuoto (triangles[x])*=m; // koita vaikka triangles.at(x), joka heittää exceptionin ylivuodon sattuaessa (triangles[x])+=pos; }
vector.size()... Miksei?
Vector.erase() jäi koodiin, kun yritin korjata sitä. Ja quadsin tyhjennys unohtui.
vidar kirjoitti:
vector.assign
tuhoaa vektorin vanhan sisällön
Tässä siis on itse syy ohjelman kaatumiseen... Mitä jos korvaan vector.insert()
-funktiolla?
Siitä vector.size()
-funktiosta vielä... Minkä arvon se palauttaa vektorin luomisen jälkeen? 0 vai 1?
insertin
pitäisi toimia ihan ok. size()
palauttaa elementtien määrän, eli 0, ellei yhtään ole lisätty.
Destruktorissa on aivan turha tyhjentää vektoria, koska vektorin destruktoria kutsuttaessa se tyhjenee kuitenkin itsestään. Tosiaan omat kokomuuttujat ovat turhia ja altistavat uusille virheille.
Sijoituksen voi hoitaa suoraan vektorien sijoitusoperaattorilla:
triangles = o.triangles; quads = o.quads;
Erillistä tyhjennystä ei tarvita, ei myöskään assign-funktion kanssa, koska sekin korvaa vanhan sisällön.
Aihe on jo aika vanha, joten et voi enää vastata siihen.