Verwenden von C-Strings in mit malloc zugewiesenen Strukturen
Beim Zuweisen von Speicher für C-Strukturen mithilfe von malloc ist es wichtig, das Vorhandensein von Daten zu berücksichtigen Mitglieder, die nicht triviale Konstruktoren erfordern, wie z. B. std::string.
Problem- und Codebeispiel
Betrachten Sie den folgenden Code, der versucht, Speicher für eine Struktur zu reservieren, die enthält ein std::string-Mitglied:
#include <iostream> #include <string> #include <cstdlib> struct example { std::string data; }; int main() { example *ex = (example *)malloc(sizeof(*ex)); ex->data = "hello world"; std::cout << ex->data << std::endl; }
Dieser Code führt wahrscheinlich zu einem Segmentierungsfehler. Das Problem entsteht, weil malloc Rohspeicher zuweist, der nicht automatisch initialisiert wird, wodurch das Mitglied std::string in einem nicht initialisierten Zustand verbleibt.
Lösung: Verwendung von C-Speicherzuweisungsoperatoren
Die richtige Methode zum Zuweisen von Speicher für C-Objekte ist die Verwendung von C-Speicherzuweisungsoperatoren wie „new“ und „delete“. Diese Operatoren rufen automatisch den Konstruktor und Destruktor für das zugewiesene Objekt auf und stellen so eine ordnungsgemäße Initialisierung und Bereinigung sicher.
Für den bereitgestellten Code besteht die Lösung darin, malloc durch new zu ersetzen:
example *ex = new example;
Alternative: Placement New
Wenn Sie Speicher mit malloc zuweisen müssen, aber dennoch C-Konstruktoren verwenden möchten, können Sie den Operator „Placement New“ verwenden:
void *ex_raw = malloc(sizeof(example)); example *ex = new(ex_raw) example;
Placement new erlaubt Sie können ein Objekt an einer bestimmten Stelle im Speicher konstruieren. Dieser Ansatz wird jedoch nur empfohlen, wenn dies aus bestimmten Gründen erforderlich ist.
Schlussfolgerung
Beim Umgang mit C-Strukturen, die nicht triviale Datenelemente enthalten, ist die Verwendung unbedingt erforderlich Richtige Speicherzuweisungstechniken mit Neu und Löschen, um undefiniertes Verhalten oder Fehler zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie kann man Speicher für C-Strukturen mit String-Mitgliedern richtig zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!