Not logged in. · Lost password · Register

Page:  1  2  next 
gabriel2029
Member since Nov 2018
52 posts
Subject: Fehlerbehandlung bei malloc
Hallo,
muss man den Fall beachten, dass, wenn malloc keinen freien Speicher findet, entsprechend agiert (z. B. -1 zurückgibt). Beispiel:
ele = malloc(sizeof(struct node));
if (ele == NULL) return -1;

LG Gabriel
xilef97
xilef97
Member since Mar 2018
11 posts
Ja.
gabriel2029
Member since Nov 2018
52 posts
Ok, danke!
rudis
SPler
(Administrator)
Member since Apr 2010
649 posts
In reply to post #1
+1 xilef97
Wichtig ist auch, dass im Fehlerfall aller schon angeforderter Speicher wieder freigeben wird.

  1. int foo(int a) {
  2.     char *x = malloc(42);
  3.     if (x == NULL) {
  4.         return -1;
  5.     }
  6.  
  7.      if (a < 0) {
  8.           free(x); // <-- dieses free ist wichtig, sonst "verliert" man Speicher wenn a < 0 ist
  9.           return -1;
  10.      }
  11.  
  12.     // ...
  13. }

In diesem Beispiel könnte man natürlich einfach das if nach vorne ziehen, aber das geht nicht immer.
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
Gibt es da eigentlich noch eine elegantere Lösung, als für jeden exit einzeln das bisher allocierte hinzuschreiben und ohne sich eine eigene Memoryverwaltung zu schreiben, die sich alle allocierten Pointer merkt?
I hate Forumssignaturen
kissen (Moderator)
Avatar
Member since Oct 2014
113 posts
Quote by Destranix:
Gibt es da eigentlich noch eine elegantere Lösung, als für jeden exit einzeln das bisher allocierte hinzuschreiben und ohne sich eine eigene Memoryverwaltung zu schreiben, die sich alle allocierten Pointer merkt?

goto
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
Hm, stimmt. Da hat man dann nur eine Zeile und muss nicht Tonnen an Argumenten als Parameter an eine Funktion übergeben.
I hate Forumssignaturen
zge
(〜 ̄▽ ̄)〜
Avatar
Member since Nov 2017
182 posts
In reply to post #5
Quote by Destranix:
Gibt es da eigentlich noch eine elegantere Lösung, als für jeden exit einzeln das bisher allocierte hinzuschreiben und ohne sich eine eigene Memoryverwaltung zu schreiben, die sich alle allocierten Pointer merkt?

MACROS, MACROS, MACROS!
;;
izibi
Blockchain-Exorzist
(Administrator)
Member since Oct 2012
557 posts
In reply to post #6
Quote by kissen:
Quote by Destranix:
Gibt es da eigentlich noch eine elegantere Lösung, als für jeden exit einzeln das bisher allocierte hinzuschreiben und ohne sich eine eigene Memoryverwaltung zu schreiben, die sich alle allocierten Pointer merkt?

goto

https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68…
Marcel[Inf]
#faui2k15, GTI-Tutor a. D.
Member since Nov 2015
617 posts
In reply to post #5
+1 sj
Quote by Destranix:
Gibt es da eigentlich noch eine elegantere Lösung, als für jeden exit einzeln das bisher allocierte hinzuschreiben und ohne sich eine eigene Memoryverwaltung zu schreiben, die sich alle allocierten Pointer merkt?

Das nennt sich höhere Programmiersprache! :) Z. B. C++.
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
Macros klingen interessant.

Wobei ich mich frage, wie genau man das bewerkstelligen will?

Höhere Programmiersprache sind selbstverständlich eine Option, nur dürfen wir die in SysProg leider nicht verwenden.
I hate Forumssignaturen
Marcel[Inf]
#faui2k15, GTI-Tutor a. D.
Member since Nov 2015
617 posts
Quote by Destranix:
Macros klingen interessant.
Devil's advocate: Makros klingen ungetypt und fehleranfällig.

Aber man kann sich in SP ja ruhig mal austoben damit :D Bitte nur keine production-level Software damit schreiben ;)
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
Also wirklich viel kann man doch nicht falsch machen, wenn man jetzt Makros nur für Preprozessorzeugs nutzt und nur dort, wo es tatsächlich Sinn macht, oder?
I hate Forumssignaturen
Marcel[Inf]
#faui2k15, GTI-Tutor a. D.
Member since Nov 2015
617 posts
Mit Konsistenz und Quality Assurance kann man selbst in der fehleranfälligsten Programmiersprache funktionierende Software schreiben. Selbst die trivialsten Makros sind nicht trivial zu implementieren. Versuch z. B. die Maximumsfunktion zu implementieren -- ohne doppelte Auswertung des Arguments! Denn die könnte seiteneffektbehaftet sein!
Destranix
Erfahrener Webhelfer und Um-Rat-Frager
Member since Sep 2018
288 posts
Eine Maximum-Präprozessoranweisung wäre eher etwas, was ich vom Compiler erwarten würde, dass er automatisch macht.

Ich würde mich bei so Makros nur auf ifdef-Zeug und direktes ersetzen von konstanten Werten beschränken, wobei letzteres auch nur dann erfolgen sollte, wenn man das nicht durch Konstanten realisieren kann.
I hate Forumssignaturen
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen