lassen Sie mich Ihnen diesen Code erklären ...
char *buf=new char[sizeof(sample)];
sample *p=new(buf)sample(10,20);
Das ist wirklich vier Zeilen Code ist, wie zwei für Ihre Bequemlichkeit geschrieben. Lassen Sie mich sie einfach erweitern
char *buf; // 1
buf = new char[sizeof(sample)]; // 2
sample *p; // 3
p = new(buf)sample(10,20); // 4
Zeile 1 und 3 sind einfach zu erklären, sie erklären beide Zeiger. buf
ist ein Zeiger auf eine char
, p
ist ein Zeiger auf eine sample
. Jetzt können wir nicht sehen, was sample
ist, aber wir können davon ausgehen, dass es entweder eine Klasse ist wo sonst definiert, oder einige der Daten, die typedef
ed (mehr oder weniger nur einen neuen Namen gegeben) aber so, sample
kann nur verknüpfen int
oder string
als Datentyp gedacht werden
Linie 2 ist ein einen Speicherblock Aufteilung und es unsere char pointer
genannt buf
zuweisen. Nehmen wir an, Beispiel war eine Klasse, die 2 Ints enthält, dh es wird (unter den meisten Compilern) 8 Byte (4 pro Int). Und so buf
zeigt auf den Anfang eines Speicherblocks, der beiseite gesetzt wurde, um char
s zu halten.
Zeile 4 ist, wo es einen großen Komplex bekommt. Wenn es nur p = new sample(10,20)
wäre, wäre es ein einfacher Fall, ein neues Objekt vom Typ sample
zu erstellen, es die zwei int
s zu übergeben und die Adresse dieses neuen Objekts im Zeiger p
zu speichern. Die Hinzufügung von (buf)
ist im Grunde gesagt new
, um den Speicher zu verwenden, auf den buf
zeigt.
Der Endergebnis ist, Sie haben einen Speicherblock zugewiesen (mehr oder weniger 8 Bytes) und es hat zwei Zeiger darauf zeigen. Einer der Punkte, buf
, betrachtet diese Erinnerung als 8 Zeichen, die andere, p
, betrachtet, ist eine einzige sample
.
Warum würden Sie das tun?
Normalerweise würden Sie nicht. Modernes C++ hat das Verfahren von new
eher überflüssig gemacht, es gibt viele bessere Möglichkeiten, mit Objekten umzugehen. Ich denke, der Hauptgrund für die Verwendung dieser Methode ist, wenn Sie aus irgendeinem Grund einen Speicherpool reservieren möchten, da es einige Zeit dauern kann, um große Speicherblöcke zu erhalten, und Sie möglicherweise in der Lage sind, sich etwas Zeit zu sparen.
Für den größten Teil, wenn Sie denken, Sie so etwas wie dies zu tun, müssen Sie versuchen, die falsche Sache
A Bit Extra-
Ich habe nicht viel Erfahrung zu lösen, mit eingebetteten oder Mobilgeräte, aber ich habe das nie benutzt gesehen.
Der Code, den Sie gepostet haben, ist im Prinzip der gleiche wie nur sample *p = new sample(10,20)
keine Methode steuert, wo das Objekt sample
erstellt wird.
Beachten Sie auch, dass Sie Objekte nicht immer dynamisch mit new erstellen müssen.
void myFunction(){
sample p = sample(10,20);
}
Dies erstellt automatisch ein sample
Objekt für Sie. Diese Methode ist viel vorzuziehen, da sie einfacher zu lesen und zu verstehen ist und Sie sich keine Sorgen über das Löschen des Objekts machen müssen. Es wird für Sie bereinigt, wenn die Funktion zurückkehrt.
Wenn Sie wirklich brauchen Verwendung von dynamischen Objekten zu machen, die Verwendung von Smart-Pointer betrachten, so etwas wie unique_ptr<sample>
Dies gibt Ihnen die Möglichkeit, dynamische Objekterstellung zu verwenden, aber Ihnen den Aufwand der manuellen speichern Sie das Objekt vom Typ Löschen sample
(Ich kann Sie auf mehr Info auf diesem wenn Sie Leben zeigen)
@thecoshman Nun, ich bin neu zu stackoverflow.com, so gut, ich werde das im Hinterkopf behalten und akzeptieren mehr Antworten – Nirvan