Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
malloc problem

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nakaa
Gast





BeitragVerfasst am: 06. Okt 2006 9:15   Titel: malloc problem

hallo,
wieso funktioniert mein malloc so nicht?

Code:

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

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

}


Code:

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <string.h>
void check_malloc(size_t bytes);

 void check_malloc(size_t bytes)
{
 void *tmp;
 tmp= (void*) malloc(bytes);
 if(tmp==NULL)
 {

    fprintf(stderr, "ERROR : Out of memory ?!\n"
                    "        Trying to (m)allocate %i Bytes failed !\n"
                    "        File: %s  Line: %d\n", (int) bytes);
    exit(1);
  }
  return tmp;
 }


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
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 06. Okt 2006 12:03   Titel:

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:

# echo 2 >/proc/sys/vm/overcommit_memory


Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

visiteur
Gast





BeitragVerfasst am: 06. Okt 2006 13:48   Titel:

gedöns!
unter http://www.c-plusplus.de/forum/viewforum.php?f=10&sid=7c2e84856281f502ce3ac4277e822d5c
des rätsels lösung....
 

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 08. Okt 2006 14:25   Titel:

Janka hat folgendes geschrieben::
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)?
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 08. Okt 2006 18:00   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

Gast
Gast





BeitragVerfasst am: 08. Okt 2006 20:08   Titel: Sparen wir uns if( NULL == (p = malloc( ... ???

Janka:
Zitat:

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«.
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 08. Okt 2006 22:41   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy