Ohne genauere Kenntnis des Codes und dessen Funktionsweise ist es schwierig, so etwas zu fixen. Da fährst Du mit einem ausführlichen Bugreport besser.
Ich habe mich trotzdem mal hingesetzt und das Beispiel auf der Bugreportseite zurückverfolgt und gleich 2 Speicherlecks gefunden:
Code: Alles auswählen
diff -upr openbabel-2.2.3/src/formats/smilesformat.cpp patched/src/formats/smilesformat.cpp
--- openbabel-2.2.3/src/formats/smilesformat.cpp 2009-07-31 19:28:36.000000000 +0200
+++ patched/src/formats/smilesformat.cpp 2010-04-23 22:57:25.000000000 +0200
@@ -820,7 +820,12 @@ namespace OpenBabel {
public:
OBSmilesParser() { }
- ~OBSmilesParser() { }
+ ~OBSmilesParser() {
+ map<OBAtom*,TetrahedralStereo*>::iterator iter;
+ for(iter=_tetrahedralMap.begin(); iter!=_tetrahedralMap.end(); ++iter) {
+ delete iter->second;
+ }
+ }
bool SmiToMol(OBMol&,const string&);
bool ParseSmiles(OBMol&);
diff -upr openbabel-2.2.3/src/obconversion.cpp patched/src/obconversion.cpp
--- openbabel-2.2.3/src/obconversion.cpp 2009-06-26 19:41:05.000000000 +0200
+++ patched/src/obconversion.cpp 2010-04-23 22:34:37.000000000 +0200
@@ -271,6 +271,7 @@ namespace OpenBabel {
pOutStream=NULL;
NeedToFreeOutStream = false;
}
+ delete pLineEndBuf;
}
//////////////////////////////////////////////////////
Das erste Leck ist tief im smile-Parser vergraben. Hier wird im Falle eines '@' im smile-String eine STL map<> mit Pointern erstellt. Der Speicher wird allerdings von C++ nicht automatisch freigegeben, daher die explizite Version. Ich bin mir in keinster Weise darüber im Klaren, wo die Freigabe genau zu erfolgen hat, dafür fehlt mir der Überblick über die Funktionsweise des Parsers und des OBMol-Konstruktes. Hier muß in jedem Falle ein Entwickler drüber schauen.
Das zweite Leck scheint ein vergessener Pufferpointer von pInputStream in OBConversion zu sein, den hab ich mal dem Destructor hinzugefügt. Auch hier wiederum keine Garantie bzgl. Nebeneffekten.
Mit den obigen Änderungen läuft das Bsp. ohne Speicherleck durch (funktioniert auch mit dem Python-binding).
Allerdings glaube ich, dass in openbabel noch mehr Lecks versteckt sind (zb. die gzip-Sache war mir noch aufgefallen, habs aber nicht getestet). Insgesamt wirkt in den Quelldateien der Umgang mit 'new' etwas abenteuerlich.
Vllt. hilft Dir das ja weiter und Du kannst hieraus einen vernünftigen Bugreport erstellen.
Grüsse jerch
Edit:
Falschen Patch eingestellt
