Programm frisst zuviel Speicher



  • Du kannst den Standard-"operator new" gegen einen eigenen austauschen. Dazu müsste in "Effektiv C++ programmieren" (1. Teil) was stehen. Damit kannst du Speicheranforderungen mitloggen.



  • FreakyBKA schrieb:

    ..wenn ich das Programm minimiere und danach wieder auf den Desktop hole, ist der Großteil des Speichers wieder frei..

    Du interpretierst das falsch. Ich gehe davon aus, dass du Windows und den Taskmanager verwendest. Unter "Speicherverbrauch" wird aber nur das "WorkingSetSize" der Anwendung angezeigt (aus der Struktur PROCESS_MEMORY_COUNTERS). Der tatsächliche Speicher ist der virtuelle Speicher udn kann im Taskmanager unter Ansicht->Spalten angezeigt werden.
    640MB für eine Anwendung (oder ist es ein Spiel?) finde ich schon recht happig.


  • Administrator

    Oder man klinkt sich einfachs ins Speichermanagement ein. Für die CRT (C Runtime) von MSVC geht dies über _CrtSetAllocHook .
    Falls man auch noch die COM Speicherverwaltung prüfen möchte, dann geht dies über IMallocSpy .

    Gibt auch verschiedene fertige Tools im Internet dafür, welche aber meistens für das Entdecken von "Speicherlöcher" sind.

    Aber mal eine andere Frage noch:
    Wie hast du überhaupt festgestellt, wieviel Speicher verbraucht wird? Ich hoffe doch nicht, dass du dazu den Taskmanager verwendet hast?

    Grüssli



  • doch den hab ich verwendet, wie soll ich es denn sonst machen? als erster indikator kann man den doch nehmen oder etwa nicht?



  • Michael E. schrieb:

    Du kannst den Standard-"operator new" gegen einen eigenen austauschen. Dazu müsste in "Effektiv C++ programmieren" (1. Teil) was stehen. Damit kannst du Speicheranforderungen mitloggen.

    Genau so wie hier beschrieben, die Operatoren new und delete überschreiben. Somit weißt du immer wie viel Speicher deine Anwendung derzeit belegt.


  • Administrator

    FreakyBKA schrieb:

    doch den hab ich verwendet, wie soll ich es denn sonst machen? als erster indikator kann man den doch nehmen oder etwa nicht?

    So wie ich es geschrieben habe, das ist die zuverlässigste Methode unter Windows. Beim TaskManager hat noch das System selber seine Funktionen im Spiel. Was du siehst, ist der vom System dem Programm zugeordnete Speicher. Das Programm muss aber diesen Speicher gar nicht verwenden oder benötigen.

    HighLigerBiMBam schrieb:

    Michael E. schrieb:

    Du kannst den Standard-"operator new" gegen einen eigenen austauschen. Dazu müsste in "Effektiv C++ programmieren" (1. Teil) was stehen. Damit kannst du Speicheranforderungen mitloggen.

    Genau so wie hier beschrieben, die Operatoren new und delete überschreiben. Somit weißt du immer wie viel Speicher deine Anwendung derzeit belegt.

    Nein, weiss er nicht. operator new zu überladen heisst nur einen kleinen Teil des Speicherverbrauchs zu überwachen.

    Grüssli



  • Naja, wenn du operator new und operator new[] kontrollierst, bleibt an Speicheränderungen nur noch der Stack. Und auf diesem kann nicht in dieser Größenordnung reserviert werden.


  • Administrator

    Michael E. schrieb:

    Naja, wenn du operator new und operator new[] kontrollierst, bleibt an Speicheränderungen nur noch der Stack. Und auf diesem kann nicht in dieser Größenordnung reserviert werden.

    Ach und was ist mit malloc ? Oder meinst du niemand verwendet malloc ? Würde mich nicht erstaunen, wenn sogar Qt malloc verwendet. Wenn man den tatsächlichen Speicherverbrauch herausfinden will, muss man schliesslich alles prüfen. Es kann ja sein, dass man einen legalen hohen Speicherverbrauch hat, weil man irgendwo eine Bibliothek zu massiv oder falsch einsetzt. Du weisst nicht, wie diese Bibliothek den Speicherverbrauch verwaltet. Du kannst mit der Überladung von operator new nicht mal auf deren Speicherverbrauch zugreifen, da dies nicht über Bibliotheksgrenzen geht.

    Grüssli



  • Stimmt.



  • sorry, dass ich das jetzt nach 2 wochen noch einmal rauskrame. aber ich habe jetzt herausgefunden, dass mein programm jedesmal 8KB mehr speicher zugewiesen bekommt (Taskmanager), wenn ich die cosf bzw sinf funktion aufrufe, die standardmäßig dabei sind.
    kann mir jemand sagen woran das liegt, denn darin liegt dann wahrscheinlich die ursache für mein speicherproblem, da ich sehr viel mit cos und sin-aufrufen arbeite.


Anmelden zum Antworten