Wie kann man Feststellen ob genug Speicher für statisches Array verfügbar ist?



  • Guten Tag

    Ich habe hier eine Funktion, bei der ich ein statisches BYTE Array mit 10K Einträgen bearbeite.

    Gelegentlich, wenn der Arbeitsspeicher sehr voll ist führt das Programm die Funktion mit diesem Array einfach nicht aus.

    Es wird aber keine Exception geworfen bzw. try/catch hat keine Funktion.

    Natürlich könnte ich die Funktion auf ein dynamisches Array umstellen.
    Aber mich würde es interessieren wie ich dieses Verhalten bei einem statischen Array verhindern kann bzw. wie man in diesem Fall den Fehler bearbeitet & behandelt.

    Denn nichts ist schlimmer als ein Fehler der immer wieder auftritt aber nicht als solcher erkannt wird.



  • Da du dein Array auf dem Stack auf baust und der Stack nur eine bestimmte Größe hat, wirst du früher oder später da logischer Weise kein Speicher mehr habe. Man kann den Stack zwar vergrößern aber besser ist es wenn du eh mehr Daten hast und dein Array nicht statisch ist das Dynamiach zu resevieren.

    Besser ist es dafür auch entsprechende Klassen die schon vorgefertigt sind zu nutzen, dann kann man schon mal fehler ausschließen und passende Klassen gibt es ja nun zu hauf.

    Vielleicht Hilft dir mein gesülz etwas weiter 😉



  • Danke für die Information.

    Natürlich verwende ich für größere Datenmengen dafür vorgesehene Klassen & dynamische Arrays.

    Es gibt aber auch alt-ehrwürdige Programme / Funktionen,... von Vorgängern die man zu pflegen hat.

    Und da ich diese Programme nicht auf den neuesten Stand der Technik umschreiben darf / will, ist es nicht schlecht zu wissen wie man mit diesen eher selten auftretenden Sonderfällen umgeht.
    (Abgesehen von Dokumentationen in denen steht das der PC mindestens X MB Arbeitsspeicher benötigt und kein anderes Programm laufen darf.)

    Es könnte rein theoretisch ja auch sein das der Speicher nicht für ein 10 oder 100 Elemente großes Array nicht reicht.
    Ich weis, da hat man dann ganz andere Probleme.



  • Alternativ könntest du auch eine "Schnittstelle" einbauen, also die Funktionen über eine Klasse Adaptieren. dann würdest du den eigentlichen Code nicht veändern und könntest trotzdem die Funktionalität ändern, also das Problem über die Klasse lösen.

    Alternativ kannst du auch suchen wie man dem Programm mehr Stack gibt, wobei na ja ist das auch nur wieder ein Workaround bis zum nächsten Probnlem wenn der wieder zu klein wird, also auch nicht die entgültige Lösung.



  • Der Stack-Speicher wird beim Linken festgelegt (und ist unabhängig von dem verfügbaren restlichen Arbeitsspeicher), s. /F (Stapelgröße festlegen).



  • Kannst auch die Funktionalitäten über einen Thread starten default haste da 1MN mit 100MB gehts aber auch dauert dann beim beenden paar millisekunden.



  • Es dürfte doch kein Problem sein, einfach den Array auf dem Heap mit einem Smartpointer zu erzeugen und dann eine entsprechende Referenz zu erzeugen, die das ganze ohne weitere Code Änderungen zulässt...

    Von mir auch das ganze ohne smartpointer...



  • Xaver schrieb:

    Aber mich würde es interessieren wie ich dieses Verhalten bei einem statischen Array verhindern kann bzw. wie man in diesem Fall den Fehler bearbeitet & behandelt.

    Denn nichts ist schlimmer als ein Fehler der immer wieder auftritt aber nicht als solcher erkannt wird.

    Ich vermute dass deine Vermutung falsch ist.
    Ein Stack Array sollte nie dazu führen dass eine Funktion "einfach nicht ausgeführt" wird. Und "sollte" heisst: ich hab sowas noch nie beobachtet, ich wüsste nicht wie das gehen sollte, ich gehe davon aus dass es nicht sein kann.

    D.h. es muss wohl an 'was anderem liegen.



  • Achromat schrieb:

    über einen Thread starten default haste da 1MN mit 100MB gehts aber auch dauert dann beim beenden paar millisekunden.

    Das halte ich jetzt erstmal für ein Gerücht.



  • hustbaer schrieb:

    Achromat schrieb:

    über einen Thread starten default haste da 1MN mit 100MB gehts aber auch dauert dann beim beenden paar millisekunden.

    Das halte ich jetzt erstmal für ein Gerücht.

    👍

    Siehe CreateThread Doku:

    dwStackSize [in]
    The initial size of the stack, in bytes. The system rounds this value to the nearest page. If this parameter is zero, the new thread uses the default size for the executable. For more information, see Thread Stack Size.



  • Danke für die Hinweise
    Damit bin ich schon ein Stück weiter gekommen.