Announcement

Collapse
No announcement yet.

malloc führt zum Absturz des Programms

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • malloc führt zum Absturz des Programms

    Hallo,

    wir haben ein Problem mit einem C Programm. Nach einigen Aufrufen einer Funktion in der malloc() verwendet wird stürzt das Programm ab. Entwickelt wird in Code:Blocks mit dem Mingw Compiler (mitgeliefert) unter Windows 7 64.

    Um den Fehler einzugrenzen haben wir einige Ausgaben mit printf() in das Programm eingebaut.

    Code:
    double funktion( struct structsetup * d_setup , double * d_teilchen ) {
    
    ...
    	double * d_diff_temp;
    
            printf("\nAllokation Temp-Array1");
            d_diff_temp = (double*) malloc( d_setup->AnzLayer * sizeof(double) );
            printf("\nAllokation Temp-Array2");
    ...
    free( d_diff_temp );
    }
    Nach einigen Aufrufen dieser Funktion kommt ein Windows Fenster mit der Meldung "programm.exe funktioniert nicht mehr" hier ist dann nur noch die Möglichkeit "Programm schließen" anzuklicken.

    Das für mich überraschende ist, dass im Konsolenfenster die Ausgabe des ersten printf() noch zu lesen ist und im Fall dieses Problems das zweite printf() nicht mehr. Für mich bedeutet das, dass alleine der Aufruf von malloc() zu diesem Absturz führt und nicht Speicher der nicht reserviert werden konnte. (Bevor der Pointer von malloc() benutzt wird, wird auf NULL geprüft usw, aber bis dahin kommt es ja gar nicht).


    Versuche mit calloc und new führten zum gleichen Problem. Auch das Ersetzen von d_setup->AnzLayer mit einer konstanten Zahl führte nicht zu einer Lösung.

    Code:Blocks gibt noch:
    Process terminated with status -1073741510 (0 minutes, 4 seconds)
    nach dem Absturz aus.

    Hat jemand eine Idee wie dieses Verhalten hervorgerufen wird?

    Vielen Dank für die Hinweise
    Philipp

  • #2
    Könnt es vielleicht sein, das das Programm einfach keine ressourcen mehr hat? du schreibst ja selber
    das die Funktion mehrmals aufgerufen wird. was zwar nicht der grund sein kann da du den speicher wieder
    frei gibst aber mal als grundlegende idee, wenn nämlich bei calloc und new das selbe passiert...

    nur als apruppte Idee

    Comment


    • #3
      Hallo,

      aber müsste malloc() dann nicht einen NULL Pointer zurückgeben und nicht das Programm zum Absturz bringen? Außerdem sollte noch jede Menge Speicher vorhanden sein.

      Comment


      • #4
        Auch wieder war... wie sieht den der rest der Funktion aus?
        schon mal im Callstack nachgeschaut was der zu letzt benutzte Aufruf war?
        manchmal hilft das. malloc ruft ja schließlich auch wieder Funktionen auf!

        Oder vielleicht hast du da in eurem programm ein speicherleck, irgendwo

        Comment


        • #5
          Die Ursache könnte auch an Codeteilen liegen, die vorher abgearbeitet werden
          Christian

          Comment


          • #6
            Hmm, das würde auch erklären, warum es sich teilweise beim Debuggen anders verhält als beim normalen starten des Debugcodes ohne den Debugger. Einen Fehler an einer ganz anderen Stelle der aber auch mit von malloc() alloziertem Speicher zu tun hat habe ich schon mal gefunden.
            Ein richtiges Speicherleck konnte ich nicht feststellen. Laut dem Taskmanager benötigt der Prozess keine 3MB was auch einem System mit 6GB Ram ja unproblematisch sein sollte. Dem Callstack konnte ich keine hilfreichen Informationen entnehmen, aber danke für diesen Hinweis.

            Ist so ein Verhalten denn normal? Das durch einen Fehler "irgendwo" ein Absturz beim einfach Aufruf von malloc() passiert?

            Comment


            • #7
              Wenn irgendeine Variable durch einen schlecht gesetzten (oder nicht initialisierten) Pointer, Arraybereichsüberschreitung oder Schreiben in einen bereits freigegebenen Speicherbereich, dorthin schreibt, wo die Speicherverwaltung demnächst Speicher anfordert, dann muss das nicht unbedingt da krachen, wo der Fehler passiert. Ich habe bei mir ein ähnliches Problem (siehe http://entwickler-forum.de/showthrea...ng-Operationen), dass ich bei new und malloc-Operationen einen Segmentation fault bekomme, also ja, beinahe alles, was mit Speicher zu tun hat, kann die Ursache irgendwo in Deinem Code oder sogar in verwendeten (nicht sauber programmierten) Bibliotheken haben.

              Was für eine Art von Fehler bekommstDu denn? Illegal Read? OutOfMemory? SegmentationFault? Einem OutOfMemory kann man mit Suche nach Speicherlecks noch auf die Schliche kommen, beim Rest hilft meist nur ein aufwendiges CodeReview

              Comment


              • #8
                Ich bekomme ein SegmentationFault und leider im Debugger an einer anderen Stelle als im Releasebuild.

                Dann wird man wohl mal weitersuchen müssen... Vielen Dank für die Unterstützung

                Comment

                Working...
                X