Stackproblem?



  • Folgendes:

    struct _AElement
    {
      short Element;
    }*APointer;
    
    struct _BElement
    {
      float Element[3];
    }*BPointer;
    
    APointer = (_AElement*)VoidPointer;
    LogArray(APointer, 45, 102);              // Alles Okay!
    
    BPointer = (_BElement*)VoidPointer;
    LogArray(BPointer, 55, 400);              // Absturz!
    
    template <class ElementType> DWORD LogArray(ElementType* ArrayPointer, int ArrayStride, int ArraySize)
    {
       LOGG("In der Template-Funktion");
    
       struct _LoggedArrays
       {
    	void* ArrayPointer;
    	DWORD FilePos;
       }LoggedArrays[1000];
    
       ElementType ArrayBuffer[100000];
    
       for(int i=0; i < 100000; i++)
       {
    	if(LoggedArrays[i].ArrayPointer == ArrayPointer) return LoggedArrays[i].FilePos;
    	if(LoggedArrays[i].ArrayPointer == 0)
            {
               LoggedArrays[i].ArrayPointer = FilePointer;
               ...
            }
        }
        ...  
    }
    

    Wenn das Array "ArrayBuffer" 100.000 Elemente hat, fliege ich irgendwann einfach so raus - nicht einmal die LOGG("...")-Ausgabe wird geliefer!
    Die Parameter sind immer Okay!

    Reduziere ich die Array-Größe von ArrayBuffer auf eine kleinere Elementanzahl (z.B. 100), gibt es keine Probleme!

    ElementType ist nie größer als 12 Byte, also ist ArrayBuffer auch nicht größer als nur 1,2MB bei 100.000 Elementen.

    Wird da der Stackrahmen überschritten?
    Setzt der VS .Net 2004 C++ Compiler dies nicht automatisch?
    Wenn nein, wie sollte der verstellt werden?

    Vielen Dank für Tips!



  • Der default stacksize ist 1MB. Kannst den über /STACK linker option hoch schrauben (Linker->System-> Stack reserve size / Stack Commit Size).

    Warum legst du das array nicht einfach auf den heap? (new / delete)


Anmelden zum Antworten