Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C (C89 und C99) ::  "Komfort" bei malloc  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
namespace invader
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.12.2008
Beiträge: 365
Beitrag namespace invader Mitglied 21:44:20 08.03.2010   Titel:              Zitieren

Z schrieb:
Bei mir läuft der Speicher ganz langsam voll, VS 2005, ca 1.6 GB nach 5 Minuten.


Wenn malloc(0) nicht NULL zurückgibt, muss man das natürlich wieder freigeben. Wenn malloc(0) NULL zurückgibt, schadet free() aber auch nicht. Am besten ruft man also einfach zu jedem malloc free auf (wäre käme denn auch auf die Idee, das nicht zu tun?)

Wie gesagt kann malloc(0) vorkommen, wenn man sich einfach die Sonderbehandlung des Falls einer Größe von 0 spart.

Zum Beispiel: Man ließt irgendwelche Pakete aus einer Datei, wobei vorher jeweils die Paketgröße selber in der Datei steht. D.h. man ließt die Größe, malloct so viel Speicher, füllt ihn mit fread(buffer,size,1,f), und macht dann irgendwas damit, wobei man natürlich nur auf Arrayindizes 0 <= i < size zugreift.

Und wenn dann mal als Größe 0 gelesen wird (was ja vielleicht im Eingabeformat erlaubt ist) und malloc NULL liefert, funktioniert das immer noch völlig problemlos und standardkonform, ohne dass man diesen Fall gesondert behandelt haben muss.
noobLolo
Unregistrierter




Beitrag noobLolo Unregistrierter 21:48:27 08.03.2010   Titel:              Zitieren

Z schrieb:
Da offensichtlich free() bei malloc(0) nötig ist, würde ich lieber sicherstellen, dass im Programm kein malloc(0) vorkommt.

die sache ist, stell dir vor du gibst eine verkettete liste frei, in dieser liste sind per malloc(x) besorgte speicher blöcke abgelegt, die freigabe routine müßte nun immer checken ob auch was zum freigeben da ist, da ja ein free(NULL) auch was ganz schlimmes ist. also ist eigentlich das problem verschoben...
Z
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.02.2010
Beiträge: 748
Beitrag Z Mitglied 21:53:33 08.03.2010   Titel:              Zitieren

namespace invader schrieb:

Wie gesagt kann malloc(0) vorkommen, wenn man sich einfach die Sonderbehandlung des Falls einer Größe von 0 spart.

Das ist wohl Geschmackssache. Ich würde bei Werten aus nicht 100%ig vertrauenswürdiger Quelle immer auf Gültigkeit prüfen:
C/C++ Code:
size_t n = irgendwo_hergeholt();
void *a;
if (n > 0 && n <= MAX)
    a = malloc(n);
else
   a = 0;  // oder Fehlerbehandlung
C/C++ Code:
size_t n = irgendwo_hergeholt();
void *a;
if (n > 0 && n <= MAX)
a = malloc(n);
else
a = 0; // oder Fehlerbehandlung
C/C++ Code:
size_t n = irgendwo_hergeholt();
void *a;
if (n > 0 && n <= MAX)
    a = malloc(n);
else
   a = 0;  // oder Fehlerbehandlung

_________________
a = b << c; /* shift happens */
µngbd
Unregistrierter




Beitrag µngbd Unregistrierter 22:03:36 08.03.2010   Titel:              Zitieren

namespace invader schrieb:
Wie gesagt kann malloc(0) vorkommen, wenn man sich einfach die Sonderbehandlung des Falls einer Größe von 0 spart.

Das klingt sinnvoll. Passt auch gut zum Standard, der vorschreibt, dass man den Zeiger von malloc(0) in jedem Fall an free() weitergeben darf, weil free(NULL) nichts tut.
noobLolo schrieb:
da ja ein free(NULL) auch was ganz schlimmes ist

Hättest nicht mehr oft umblättern müssen bis:
TC2 7.20.3.1 schrieb:
The free function causes the space pointed to by ptr to be deallocated, that is, made
available for further allocation. If ptr is a null pointer, no action occurs.

:)
noobLolo
Unregistrierter




Beitrag noobLolo Unregistrierter 22:04:31 08.03.2010   Titel:              Zitieren

noobLolo schrieb:
Z schrieb:
Da offensichtlich free() bei malloc(0) nötig ist, würde ich lieber sicherstellen, dass im Programm kein malloc(0) vorkommt.

die sache ist, stell dir vor du gibst eine verkettete liste frei, in dieser liste sind per malloc(x) besorgte speicher blöcke abgelegt, die freigabe routine müßte nun immer checken ob auch was zum freigeben da ist, da ja ein free(NULL) auch was ganz schlimmes ist. also ist eigentlich das problem verschoben...

habs gerade nochmal getestet, free(0) geht, hab das iwie mit uninitialisierten pointern vertauscht

C/C++ Code:
void *p;
free(p);
C/C++ Code:
void *p;
free(p);
C/C++ Code:
void *p;
free(p);

=> *boom*

lg lolo
woooooah
Unregistrierter




Beitrag woooooah Unregistrierter 22:22:09 08.03.2010   Titel:              Zitieren

Z schrieb:

C/C++ Code:
   while(1)
      void *z = malloc(0);
C/C++ Code:
while(1)
void *z = malloc(0);
C/C++ Code:
   while(1)
      void *z = malloc(0);

Bei mir läuft der Speicher ganz langsam voll, VS 2005, ca 1.6 GB nach 5 Minuten.


Könnte mir jemand das erklären wieso das so ist? :(
Das ist irgendwie interessant auch wenn es blödsinnig aussieht.
noobLolo
Unregistrierter




Beitrag noobLolo Unregistrierter 22:32:34 08.03.2010   Titel:              Zitieren

woooooah schrieb:
Z schrieb:

C/C++ Code:
   while(1)
      void *z = malloc(0);
C/C++ Code:
while(1)
void *z = malloc(0);
C/C++ Code:
   while(1)
      void *z = malloc(0);

Bei mir läuft der Speicher ganz langsam voll, VS 2005, ca 1.6 GB nach 5 Minuten.


Könnte mir jemand das erklären wieso das so ist? :(
Das ist irgendwie interessant auch wenn es blödsinnig aussieht.

wieso postest du in einen thread den du nicht gelesen hast? :rolleyes:
heyhoi
Unregistrierter




Beitrag heyhoi Unregistrierter 22:44:10 08.03.2010   Titel:              Zitieren

noobLolo schrieb:
wieso postest du in einen thread den du nicht gelesen hast? :rolleyes:

Ich hab den thread gelesen aber ich verstehe nicht wieso 0 bytes auch eine größe ist. was wird da angefordert?
noobLolo
Unregistrierter




Beitrag noobLolo Unregistrierter 22:46:11 08.03.2010   Titel:              Zitieren

evtl. hast auch ein problem mit deinem englisch :confused:

noobLolo schrieb:

...
schauen wir doch mal wie das in der glibc gemacht wurde;)
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
/* Allocate an N-byte block of memory from the heap.
   If N is zero, allocate a 1-byte block.  */


void *
rpl_malloc (size_t n)
{
  if (n == 0)
    n = 1;
  return malloc (n);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
/* Allocate an N-byte block of memory from the heap.
If N is zero, allocate a 1-byte block. */


void *
rpl_malloc (size_t n)
{
if (n == 0)
n = 1;
return malloc (n);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
/* Allocate an N-byte block of memory from the heap.
   If N is zero, allocate a 1-byte block.  */


void *
rpl_malloc (size_t n)
{
  if (n == 0)
    n = 1;
  return malloc (n);
}
...
heyhoi
Unregistrierter




Beitrag heyhoi Unregistrierter 22:50:45 08.03.2010   Titel:              Zitieren

danke nooblolo :)
hab es aus dem thread nicht rauslesen können!
C/C++ Forum :: C (C89 und C99) ::  "Komfort" bei malloc  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.