[erledigt] malloc und cast



  • Hallo,

    ich habe eine frage, und zwar:

    int *mvar = (int*)malloc(sizeof(int));
    

    Jetzt habe ich schon öfter gelesen, das man den rückgabewert von malloc nicht castet bzw. nicht casten soll. Warum?

    Btw: ist die suchfunktion kaputt? malloc + cast liefert kein ergebnis!

    Danke.

    Grüße,



  • Steini79 schrieb:

    Jetzt habe ich schon öfter gelesen, das man den rückgabewert von malloc nicht castet bzw. nicht casten soll. Warum?

    Technische Gründe: wenn man stdlib.h vergessen hat zu includieren, kann ein Cast eine Fehlermeldung verhindern, die man normalerweise bekommen würde, weil eine implizit deklarierte Funktion int zurückgibt.

    Andere Gründe:
    Es ist nicht nötig.
    Es ist nur in C++ nötig und wir schreiben C.

    Nicht-Gründe:
    Es ist in C++ nötig und man sollte Code möglichst so schreiben, dass er in beiden Sprachen funktioniert.

    Btw: ist die suchfunktion kaputt?

    Ja.



  • Noch ein kleiner Zusatz:

    In C++ willst du eh kein malloc/free verwenden, sondern eher new/delete . Die beiden Operatoren haben auch den Vorteil, dass gleichzeitig der Konstruktor/Destruktor des Types für das erstellte Objekt aufgerufen wird.

    Kurz: es gibt überhaupt keinen Grund, von malloc zu casten.
    Es schadet aber auch nicht direkt, zumindest nicht dann, wenn der Code sich nicht ändert (wenn du den Speicher von malloc früher einem foo zugewiesen hast, das jetzt ein bar ist) und wenn du nicht den hinterletzten Ranzcompiler verwendest. Der gcc wirft mir bei einem Cast vom Rückgabewert von malloc ohne Einbinden von stdlib.h eine Warnung raus.



  • dachschaden schrieb:

    In C++ willst du eh kein malloc/free verwenden, sondern eher new/delete . Die beiden Operatoren haben auch den Vorteil, dass gleichzeitig der Konstruktor/Destruktor des Types für das erstellte Objekt aufgerufen wird.

    Was aber auch genau zum Performance Nachteil werden kann, weshalb man auch in C++ malloc & free gerne nutzen darf 😉



  • mr. malloc schrieb:

    dachschaden schrieb:

    In C++ willst du eh kein malloc/free verwenden, sondern eher new/delete . Die beiden Operatoren haben auch den Vorteil, dass gleichzeitig der Konstruktor/Destruktor des Types für das erstellte Objekt aufgerufen wird.

    Was aber auch genau zum Performance Nachteil werden kann, weshalb man auch in C++ malloc & free gerne nutzen darf 😉

    Nö, nicht wegen Performance um Konstruktoren zu sparen. Außerdem gibts noch ::operator new.



  • In C++ will man new/new[] und delete/delete[] (besonders delete/delete[]) eher selten verwenden, von malloc/free ganz zu schweigen. Vektoren, Smartpointer, wissenschon. Solange man Äpfel mit Äpfeln vergleicht, bringen die alle keine Performanceverluste mit sich.

    Was den Cast angeht: Aus meiner Sicht ist das mehr oder weniger egal. Neuere gccs zum Beispiel warnen (auch ohne -Wall), wenn man stdlib.h nicht eingebunden hat, auch dann, wenn ein Cast am malloc steht (implicit declaration of yadda yadda). clang hält es genauso, msvc ab Warnstufe 3 (muss man einstellen, sollte man eh tun).

    Wenn man den Code durch einen C++-Compiler jagen will, geht das mit dem Cast, aber das ist nur bedingt als Vorteil zu sehen. Man macht so was ja im Zweifel nur, um ihn mit C++-Konstrukten zu erweitern, und dann hat man auf einmal C++-Code mit C++-Konstrukten und nackten mallocs, die einem Dinge wie Exceptionsicherheit zielsicher zerschießen. Es mag Fälle geben, in denen jemand weiß, was er tut, wenn er so etwas versucht, aber dieser jemand wird sich um andere Dinge als Casts vor malloc Gedanken machen.



  • Man kann aber zum Beispiel C-Quellen, die dann reichlich malloc/free beinhalten können, auch mit einem C++ Compiler übersetzen, was einem höhere Typsicherheit bringt.

    Dann muss man den type-cast halt immer machen.



  • lol. Und was machst mit deinem Gecaste? Richtig: Du trittst das Typsystem sowieso mit Füßen. 💡



  • Danke für die infos!


Anmelden zum Antworten