Ich denke, ich habe ein gutes Verständnis davon, wie man mit Speicher in C++ umgeht, aber es in C zu machen ist anders, ich bin ein bisschen daneben.Der beste Weg, Speicherzuweisung in C zu behandeln?
In C++ habe ich Konstruktoren und Destruktoren, ich habe die ziemlich einfach neu und löschen und ich weiß, wie man es mit RAII verkapselt, mit Smartpointern und innerhalb von Klassen.
Allerdings kann ich in C nicht malloc umgehen und auf die gleiche Weise frei. Ich weiß nicht, wie ich sie verstecken und automatisieren soll. Alles, was ich herausfinden kann, sind Funktionen, um meine Zeiger zu initiieren und zu zerstören. Aber wie sollte ich meine Speicherverwaltung strukturieren?
Während ich dies schreibe, habe ich erkannt, dass es eher eine Frage ist, ob ich den Fluss von C verstehe als alles andere, aber eine Frage nach der anderen.
Bearbeiten: Danke für die Antworten, aber ich muss mich neu formulieren.
Wenn ich sage, dass ich RAII und Smart Pointer für C++ verwende, will ich nicht das gleiche für C, ich weiß, es ist nicht das Gleiche. Aber wie ich die Speicherzuweisung in C++ bearbeite, ist mit diesen Techniken verbunden.
Zum Beispiel in meinen Klassen ich dynamisch hinzufügen und zerstören den Speicher meiner Klasse verwendet. Auf diese Weise kann ich eine Art Kapselung erreichen, ich muss nicht wissen, wann/wie/warum die Klasse ihren Speicher verarbeitet, sie tut es einfach. Dies bedeutet, dass ich die Handhabung des unteren Speichers "verstecken" und mich nur auf einige "größere" Klassen konzentrieren kann.
Was ich wissen möchte ist, was ist die beste Praxis im Umgang mit Speicher in C? Es gibt keine Klassen mit Konstruktoren/Destruktoren, um das für mich zu handhaben. Ist es gut, am Anfang einer Funktion Speicher zuzuordnen oder eine Funktion zu verwenden, die sie für mich erstellt? Und wie sollte ich sie wieder befreien?
Dies sind allgemeine Fragen und sie unterscheiden sich von Situation zu Situation, aber wie gehen Sie am liebsten damit um? Welche Tipps und Lektionen kannst du geben?
Sie benötigen die Besetzung nicht (außer wenn Sie einen Aufruf von malloc() direkt als varargs-Funktionsargument übergeben oder Pre-ANSI-Compiler verwenden). Das führt zu einem schlechten Habit, weil es eine fehlende #Include verbirgt. –
dirkgently
+1 für malloc/frei im gleichen Bereich und für p = NULL nach free(). malloc/free in demselben Bereich ist eine gute Lokalisierung, und beachte, dass "doing your work" Funktionsaufrufe beinhalten kann, die Zeiger verwenden. Beste Antwort zu dieser Zeit. – dwc
das ist eine andere stilistische Sache, Dirk. Ich bevorzuge die explizite Besetzung, weil das Teil meiner eigenen Typ-Argumentation ist, die ich durchführe, während ich C schreibe. Ich sehe "(char *) malloc" als eine abstrakte Operation, die ein malloksiertes Char-Stück Speicher zurückgibt. –