forloRn_
Legacy Member
Gegroet,
Mijn handboek is wat onduidelijk. Stel dat je een klasse Person hebt, en een klasse Student (heel origineel, ik weet het) die ervan overerft, en een nieuwe stack-variabele int gpa toevoegt.
De destructor van s wordt niet aangeroepen; wordt de variabele gpa vernietigd wanneer delete p wordt aangeroepen, of is er een memory leak?
Volgens mijn boek:
Nog volgens het boek is dit het default gedrag van een destructor:
Moet je destructor virtual zijn als je subklasse enkel stack-variabelen toevoegt?
De eigenlijke reden waarom ik dit vraag, is omdat ze een paar bladzijden verder in het boek een vector <Shape *> maken, en de Shapes erin vernietigen met:
In de vector komen *Circle's terecht, waarbij Circle overerft van Shape, en enkel een double radius toevoegt.
Volgens het boek:
Mijn handboek is wat onduidelijk. Stel dat je een klasse Person hebt, en een klasse Student (heel origineel, ik weet het) die ervan overerft, en een nieuwe stack-variabele int gpa toevoegt.
Code:
Student *s = new Student(...)
Person *p = s;
delete p;
De destructor van s wordt niet aangeroepen; wordt de variabele gpa vernietigd wanneer delete p wordt aangeroepen, of is er een memory leak?
Volgens mijn boek:
boek zei:Any memory in the Student data fields that was allocated from the memory heap either directly (via calling new), or indirectly (e.g., if there is a string or vector as a data member) is never reclaimed and we have a subtle memory leak.
Nog volgens het boek is dit het default gedrag van een destructor:
boek zei:The destructor is implemented by invoking destructors on each of the newly added data members, followed by invoking the destructor on the base class(es).
Moet je destructor virtual zijn als je subklasse enkel stack-variabelen toevoegt?
De eigenlijke reden waarom ik dit vraag, is omdat ze een paar bladzijden verder in het boek een vector <Shape *> maken, en de Shapes erin vernietigen met:
Code:
void cleanup(vector <Shape *> &a) {
for (int i = 0; i < a.size(); i++)
delete a[i];
}
In de vector komen *Circle's terecht, waarbij Circle overerft van Shape, en enkel een double radius toevoegt.
Volgens het boek:
boek zei:cleanup simply steps through the array invoking delete. Observe that this would not work if the Shape class did not correctly declare a virtual destructor.
