2012-04-10 10 views
0

Wie reserviere ich Speicher mit neuen an einem festen Ort? Mein Buch sagt, dies zu tun:Wie reservieren Sie Speicher an einem bestimmten Ort?

char *buf=new char[sizeof(sample)]; 
sample *p=new(buf)sample(10,20); 

hier neu ist die Zuteilung Speicher an buf Adresse und (10,20) sind Werte weitergegeben werden. Aber was ist Probe? ist es eine Adresse oder ein Datentyp?

+1

@thecoshman Nun, ich bin neu zu stackoverflow.com, so gut, ich werde das im Hinterkopf behalten und akzeptieren mehr Antworten – Nirvan

Antwort

0

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)

+0

mein Buch sagt, dass Placement-neue Zuordnung für Arrays in Programmierumgebungen für mobile Geräte und andere eingebettete Systeme erforderlich ist. Das Buch ist "Let us C++" von Yahsavant Kanetkar. – Nirvan

+0

Ich habe ein bisschen zu sagen, also aktualisieren Sie die Antwort für Sie – thecoshman

0

Es ist ein Datentyp oder ein typedef.

+0

das ist nicht, was ich meinte. Sample ist eine Klasse, aber was ich gefragt habe, war was das "Sample" in der letzten Zeile angezeigt hat. – Nirvan

+0

@Nirvan: Ich sehe, du meintest das zweite Auftreten von 'Probe' in der letzten Zeile. Ich nahm an, du meintest den ersten. –

Verwandte Themen