Hallo, ich habe mal wieder ein kleines Problem, für das ich noch keine rechte Lösung weiß.
Ich schreibe gerade an der Testklasse für den SqliteWrapper weiter. Wer sich das ansehen will, es liegt im Branch Dataholding. Ich will dabei testen, ob der dynamisch angeforderte Speicher für das Sql Result wieder freigegeben wird. Hier erst einmal die zu testende Funktion:
Code: Alles auswählen
void Dedupe::Dataholding::SqliteWrapper::FreeResult()
{
Dedupe::Dataholding::SqliteWrapper::Row row;
Dedupe::Dataholding::SqliteWrapper::Value value;
for( Dedupe::Dataholding::SqliteWrapper::Result::const_iterator
iter = ReturningTable.begin(); iter != ReturningTable.end(); iter++ )
{
row = *iter;
for( Dedupe::Dataholding::SqliteWrapper::Row::const_iterator
RowIter = row.begin(); RowIter != row.end(); RowIter++ )
{
value = RowIter->second;
delete( value );
value = NULL;
}
}
ReturningTable.clear();
}
Hier noch die verwendeten Datentypen:
Code: Alles auswählen
typedef Dedupe::Dataholding::Variant::Data * Value;
typedef std::map<std::string,Value> Row;
typedef std::vector<Row> Result;
Variant::Data ist eine Basisklasse, die jeden Datentyp halten kann. Das ganze wird als Tabelle abgebildet, d.h. Ein Row enthält den Spaltennamen und den Basisklassenpointer auf den zugehörigen Wert. Diese Row wird dann in einen Vector vom Typ Result gepusht. Die obige Funktion durchläuft jetzt diesen Vector und jedes Row und löscht über den Basisklassenpointer die Daten, auf die Value zeigt. Ich will jetzt überprüfen, ob alles, worauf ein Value zeigt auch gelöscht wurde, und nicht irgendwo ein Wert übersehen wird. Ich dachte an eine Liste, mit allen Valueadressen. Nach dem Aufruf der Löschfunktion müsste ich dann nur überprüfen, ob an den Adressen auch nichts mehr steht. Nur ein Zugriff auf einen tatsächlich gelöschten Bereich, ergibt ein Segmentation fault. Kann man so eine Art Testzugriff machen, damit der Fehler nicht auftritt und ich trotzdem weiß, ob alles weg ist? Meine Versuche mit Operatorenüberladung waren nicht zufriedenstellend und für automatische Tests auch eher unpraktisch. Man kann zwar per Valgrind testen, daher weiß ich auch, das die Funktion fehlerfrei arbeitet, aber ich will das ganze gerne im Unittest haben.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!