2013-07-26 4 views
9

Es scheint, dass der Zuordner die gleiche Arbeit wie "Platzierung neu" und "Operator neu" ausführt. und seine Schnittstelle ist bequemer.Brauchen wir noch "Platzierung neu" und "Operator neu"?

Zum Beispiel:

string *ps = static_cast<string *>(operator new(sizeof(string))); 
new (ps) string("Hello"); 
cout<<*ps<<endl; 

kann

allocator<string> as; 
string *ps2 = as.allocate(1); 
as.construct(ps2,"Hello"); 
cout<<*ps2<<endl; 

es so umgeschrieben werden, das bedeutet, dass "die Platzierung neue Operator" und "neuer" veraltet ist?

+0

Für Abwärtskompatibilität. –

+2

Genauer gesagt, 'Zuweiser' benötigt sowohl' Platzierung neu' als auch 'Operator neu', um das zu tun, was es tut. Ich würde sagen, sie sind nicht "veraltet", sondern sollten nicht im Client-Code verwendet werden. –

+0

Platzierung ist in der Tat in der Lage, insbesondere in frei stehenden Umgebungen, wie eingebetteten Systemen und Osen. – Skeen

Antwort

5

Sie werden immer noch benötigt. Wie sonst würden Sie Ihren benutzerdefinierten Zuordner implementieren? ;)

Edit:

Wenn Sie construct Member-Funktion einen Blick auf die std :: Allocator des nehmen können Sie die Platzierung neuer Betreiber sehen, dass es verwendet:

Diese Antwort mehr Erklärung verdient.

Also, die Verantwortung eines Zuweisers ist die Zuweisung nicht initialisierten Speicher groß genug für das Objekt über Member-Funktion allocate, und dann "in-Place" konstruieren es in diesem Speicher über seine construct Mitglied. Letzteres wird mit Placement new durchgeführt.

Verwandte Themen