malloc problem

Post Reply
Message
Author
Nakaa

malloc problem

#1 Post by Nakaa »

hallo,
wieso funktioniert mein malloc so nicht?

Code: Select all

#include"malloc.h"
void check_malloc(size_t bytes);
double test;
int main()
{

   test = (double *)check_malloc(5*sizeof( double ));

}

Code: Select all

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <string.h>
void check_malloc&#40;size_t bytes&#41;; 

 void check_malloc&#40;size_t bytes&#41;
&#123;
 void *tmp;
 tmp= &#40;void*&#41; malloc&#40;bytes&#41;;
 if&#40;tmp==NULL&#41;
 &#123;

    fprintf&#40;stderr, "ERROR &#58; Out of memory ?!\n"
                    "        Trying to &#40;m&#41;allocate %i Bytes failed !\n"
                    "        File&#58; %s  Line&#58; %d\n", &#40;int&#41; bytes&#41;;
    exit&#40;1&#41;;
  &#125;
  return tmp;
 &#125;
Fehlermeldung:
In file included from malloc.c:5:
../malloc.h: In function `check_malloc':
../malloc.h:19: warning: `return' with a value, in function returning void
malloc.c: In function `main':
malloc.c:11: error: void value not ignored as it ought to be

merci,
nakaa

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

1. Dein main() ist als int vereinbart, liefert aber keinen Wert zurück. Außerdem muss das in C int main(void) heißen, oder int main(int argc, char* argv[]). int main() ist eine C++-Notation.
2. Dein check_malloc() ist als void vereinbart, hat aber als letzten Befehl "return" und der Rückgabewert soll in main() ein double* sein. Das ist doch ziemlich durcheinander.
3. Um malloc() benutzen zu können, muss man <stdlib.h> einbinden.

Im übrigen wird unter Linux malloc() normalerweise niemals NULL zurückliefern, vorher werden wahllos Prozesse gekillt. Wenn du das verhindern willst, musst du das Memory Overcommit abschalten.

Code: Select all

# echo 2 >/proc/sys/vm/overcommit_memory
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

visiteur

#3 Post by visiteur »

gedöns!
unter http://www.c-plusplus.de/forum/viewforu ... 277e822d5c
des rätsels lösung....

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#4 Post by Lateralus »

Janka wrote:Im übrigen wird unter Linux malloc() normalerweise niemals NULL zurückliefern, vorher werden wahllos Prozesse gekillt. Wenn du das verhindern willst, musst du das Memory Overcommit abschalten.
Hi Janka

Aus Interesse: Gilt das auch für Prozesse, die nicht die UID desjenigen tragen, der malloc aufruft (außer bei root natürlich)?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#5 Post by Janka »

Ja. Da das vm-Subsystem die Schuld an einem durch overcommit überfüllten Speicher ja selten einem bestimmten Prozess oder auch nur Benutzer zuordnen kann -- schließlich brauchen alle Prozesse den Speicher --, erwischt es halt auch alle Prozesse, bis wieder genügend Speicher frei ist. Der Fehler tritt ja auch nicht bei malloc() auf, sondern erst, wenn *irgendein* Prozess den vor Urzeiten angeforderten Speicher auch tatsächlich beschreiben will. Das ist ja gerade der Sinn des Overcommit. Man macht ein malloc(1024*1024), weil einen 1MB-Puffer irgendwann mal braucht. Kriegen tut man den Speicher aber erst, und auch nur pageweise, wenn man eine bestimmte Page beschreibt!

Ob root-Prozesse als letzte gekillt werden, müsste ich erst einmal nachgucken. Evtl. ist das auch konfigurierbar.

Memory Overcommit ist für Desktop-Systeme ziemlich sinnvoll, finde ich, weil jeder Prozess sehr viele Dateien komplett in den Speicher mappen darf -- knatsch gibt es erst, wenn RAM *und* Swap aufgebraucht sind. In diesem Fall ist das System aber durch den Swap-Gebrauch schon so langsam, dass der Benutzer freiwillig die Prozesse beendet, die er gerade nicht braucht.

In einem Server ist Memory Overcommit allerdings ziemlich fies, da das Gerät normalerweise ohne direktes Admin-Feedback läuft und ein drohender Speicherüberlauf normalerweise nicht erkannt wird. In diesem Anwendungsfall ist es sicher besser, es abzuschalten, da die Prozesse sich zumindest ordentlich beenden können (im Falle von apache etc. wird ja sogar nur das sich eben gerade böse verhaltenene Kind beendet). So erst ist eine Fehlersuche möglich.

Ich bin über dieses Verhalten selbst schon einmal gestolpert und habe mich danach informiert. Für genauere Informationen müsstest du selbst nachlesen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Gast

Sparen wir uns if( NULL == (p = malloc( ... ???

#6 Post by Gast »

Janka:
Im übrigen wird unter Linux malloc() normalerweise niemals NULL zurückliefern, vorher werden wahllos Prozesse gekillt. Wenn du das verhindern willst, musst du das Memory Overcommit abschalten.
Also, wenn ich bei mir mehr Speicher anfordere, als frei ist, liefert malloc NULL. Ohne Prozesskillerei oder abgesch. Overcommit. Den gesammten freien Speicher kann ich allerdings auch mehrmals (zur selben Zeit) allozieren: Linux' optimistic memory allocation strategy. Ernst wird es doch erst, wie Janka sagt: »wenn *irgendein* Prozess den vor Urzeiten angeforderten Speicher auch tatsächlich beschreiben will«.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#7 Post by Janka »

Stimmt, die Default-Strategie sagt wohl: Wird "viel zu viel" angefordert, gibt mmap() und damit auch malloc() einen Fehler zurück. Also, z.B. wenn man mehr als RAM+Swap zusammen auf einmal anfordert.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply