Ich habe mir ja die letzten Tage die Aufnahmeeinstellungen angesehen. Wenn mich nicht alles täuscht, produzieren dieses Menü und auch alle anderen Einstellungsmenüs riesige Speicherlecks. Versucht mir mal zu folgen.
In
CRecordSetup::showRecordSetup() wird bspw. ein MenuWidget namens
directRecordingSettings mit
new erzeugt. Dieser wird als
jumpTarget an einen MenuForwarder übergeben.
Code: Alles auswählen
CMenuWidget *directRecordingSettings = new CMenuWidget(...);
CMenuForwarder* mf7 = new CMenuForwarder(..., directRecordingSettings, ...);
Dann wird dieser MenuForwarder in ein anderes MenuWidget namens
recordingSettings eingehängt.
Das MenuWidget namens
recordingSettings wird dann später beim Schließen des Menüs gelöscht.
Laut menue.cpp wird dabei folgender Code aufgerufen:
Code: Alles auswählen
CMenuWidget::~CMenuWidget()
{
for(unsigned int count=0;count<items.size();count++)
{
CMenuItem * item = items[count];
if ((item != GenericMenuSeparator) &&
(item != GenericMenuSeparatorLine) &&
(item != GenericMenuBack)&&
(item != GenericMenuCancel))
delete item;
}
items.clear();
page_start.clear();
}
Meiner Meinung nach löscht das aber nur den MenuForwarder auf
directRecordingSettings und nicht das Element selbst. Das bleibt dann im Speicher zurück. Der MenuForwarder selbst löscht nämlich das
jumpTarget nicht. Und das darf er ja auch gar nicht, da er nicht wissen kann, ob ich das Element noch brauche.
Ich glaube, eine Lösung des Problems wäre, die Elemente nicht mit
new anzulegen sondern so:
Code: Alles auswählen
CMenuWidget directRecordingSettings(...);
CMenuForwarder* mf7 = new CMenuForwarder(..., &directRecordingSettings, ...);
Oder man macht es so wie in
CZapitSetup::InitZapitChannelHelper() und legt sich einen Vector
toDelete an, der alle zu löschenden Objekte aufnimmt. Diese werden dann am Ende gelöscht.
Code: Alles auswählen
std::vector<CMenuWidget *> toDelete;
...
// delete dynamic created objects
for(unsigned int count=0;count<toDelete.size();count++)
{
delete toDelete[count];
}
toDelete.clear();
Das alles gilt natürlich nicht nur für die MenuWidgets sondern auch für alle anderen Elemente, die mit
new angelegt und dann als jumpTarget an einen MenuForwarder übergeben werden.
Oder habe ich da einen Denkfehler?