[Gelöst] Speicherloch bei std::string
Verfasst: 22.04.2010, 19:59
Hallo,
ich habe durch Zufall das folgende Verhalten auf einem Linux-System mit Valgrind gemacht. Natürlich zuerst ein Minimalbeispiel:
Die beiden zuletzt kommentierten Zeilen enthalten dabei die Valgrind-Ausgabe ... im ersten Fall ein Speicherloch, im zweiten Fall keines.
Fragen:
Edit:
Ich hatte wirklich Tomaten auf den Augen. Der Destruktor von MyBase muss natürlich virtuell sein, damit die Speicherfreigabe klappt. (Normalerweise mache ich den Destruktor immer virtuell, aber da das Beispiel ursprünglich aus einer ganzen Batterie von mehreren Hundert "Mini-Klassen" stammt, hatten die gar keinen Destruktor, und ich hab darum das Thema der virtuellen Destruktoren völlig vernachlässigt.) Sorry für den Thread ;)
ich habe durch Zufall das folgende Verhalten auf einem Linux-System mit Valgrind gemacht. Natürlich zuerst ein Minimalbeispiel:
Code: Alles auswählen
#include <string>
class myBase {};
class myDerived : public myBase
{
public:
std::string str;
};
class myOtherClass
{
public:
myBase *b;
};
int main(int argc, char* argv[])
{
myOtherClass o;
myDerived* d = new myDerived;
o.b = d;
d->str = "asd";
// Eines von beiden auskommentieren
//delete o.b; // Valgrind meldet "16 bytes in 1 blocks are definitely lost"
//delete d; // Valgrind meldet "0 errors from 0 contexts"
return 0;
}
Fragen:
- 1. Habe ich einen grundsätzlichen programmiertechnischen Fehler begangen?
2. Falls nein bei (1): Liegt es an der von mir verwendeten libstdc++?
3. Fall ja bei (1): Müsste es nicht bei beiden Fällen zu einem Speicherloch kommen?
4. Ist das Verhalten bei euch reproduzierbar?
Edit:
Ich hatte wirklich Tomaten auf den Augen. Der Destruktor von MyBase muss natürlich virtuell sein, damit die Speicherfreigabe klappt. (Normalerweise mache ich den Destruktor immer virtuell, aber da das Beispiel ursprünglich aus einer ganzen Batterie von mehreren Hundert "Mini-Klassen" stammt, hatten die gar keinen Destruktor, und ich hab darum das Thema der virtuellen Destruktoren völlig vernachlässigt.) Sorry für den Thread ;)