1

Ich arbeite an einem C++ - Projekt, das die Verwendung von lpsolve Version 5.5 zur Lösung vieler linearer Programme beinhaltet. Ich habe Probleme mit Speicherlecks.Freigeben von lpsolve-Speicher

Ich schrieb einige Test-Code:

int main(){ 
    for(int i = 0; i < 100; i++){ 
    lprec* lp = make_lp(0, 5000); //0 rows, 5000 columns 
    set_verbose(lp, IMPORTANT); 
    solve(lp); 
    delete(lp); 
    } 
} 

Dieser Code etwa 80 Millionen Bytes, mit genau 100 Fehler Lecks. Gibt es ein bekanntes Leck innerhalb von lpsolve oder handle ich mit der Bereinigung falsch?

Dank

+0

Ohne eine Definition von '' 'make_lp'''no kann man Ihnen helfen! Ich habe nie lpsolve verwendet, aber ich bezweifle sehr, dass es Speicherlecks gibt, die ohne eine harte Kernnutzung beobachtet werden (= geringe Wahrscheinlichkeit von Speicherlecks). – sascha

Antwort

1

Es stellt sich heraus, das eine relativ einfache Fehler, indem sie nicht lesen docs sorgfältig, aber ich lasse dies hier für den Fall, jemand anderes findet es hilfreich verursacht war.

Der Standard C++ delete wird nicht freier Speicher zugeordnet zu einem lprec. Verwenden Sie stattdessen lpsolve delete_lp()(1) oder free_lp()(2) statt.

+0

Dies ist eine allgemeine Regel! Jede Ressourcenzuweisungsfunktion wird mit der Zuweisungsfunktion "Partner" geliefert. Sie werden dies in ** allen ** gut gestalteten APIs sehen. In der Tat wäre das Fehlen einer solchen Zuweisung/Freigabezuweisung ein schwerwiegender Fehler in der API, selbst wenn die gesamte Zuweisungsfunktion "frei"/"löschen" (oder gar nichts) aufrufen würde. Dies gilt sogar für verschiedene Sprachen, obwohl in modernen Sprachen die Freigabe oft ausgeblendet wird; Zum Beispiel würden Sie in einer richtigen C++ - Bibliothek stattdessen einen Destruktor verwenden. –