2010-11-23 7 views
5

In meinem Code Überprüfung ich einige „hässlich“ Struktur sehe ich verwenden, in einer Klasse (die so genannte „Karte“) Ich habe einen Vektor, der eine „Daten“ Klasse enthält:Speicherverwaltung & std :: allocator

std::vector<PointerToHUGEClass> vector; 

Wo PointerToHUGEClass ist genau wie der Name beschreibt. (Obwohl das Objekt auch gezeigt wurde, gehört es auch der map-Klasse und wurde mit dem Parameter "new" im Konstruktor erstellt). Das funktioniert alles gut (im Moment). Aber ich habe immer noch das Gefühl, dass es eher eine Art Work-around ist.

Die nur Grund, warum ich eine "PointerToHUGEClass" anstelle von nur "HUGEClass" verwende, ist, weil ich sicherstellen wollte, dass das Objekt nicht vom Stapel deklariert wird. Dies wurde jedoch gemacht, bevor ich Allokatoren verstand. Jetzt fühle ich, dass es mehr oder weniger die Aufgabe des Zuweisers ist sicherzustellen, dass der Speicher nicht vom Stapel deklariert wird.

Meine Fragen:

  • Bin ich in der Annahme, die allocator korrigieren ist aus den Elementen für die Speicherverwaltung verantwortlich? (Und stellen Sie sicher, dass es aus Stack/Freestore/Heap/was auch immer erklärt wird)
  • Was macht der Std :: Allokator? - Deklariert es vom Stapel oder vom Heap?
  • (Fortsetzung von der vorherigen Frage): Wenn ich ein im Stack deklariertes Element in die Datenstruktur kopiere, wird es immer noch im Heap deklariert?

Thanks again, paul23

+0

@Simone: hmm, dass der Code 'std :: vector ' oder 'std :: vector ' Thanks for noting lesen sollte. (Obwohl es meine Fragen nicht wirklich ändert, sind die Fragen allgemeiner, da ich mich schon seit einem Jahr frage) – paul23

Antwort

8
  • ich in der Annahme, die allocator korrigieren Bin ist verantwortlich für die Speicherverwaltung aus den Positionen? (Und sicherstellen, dass es von dem Stapel deklariert/Frees/Haufen/was auch immer)

Nein, Sie sind es nicht. Der Zuordner ist nur Zucker-Beschichtung über new und delete und in der Regel verantwortlich für die Entscheidung , wobei der Speicher zugewiesen wird.Die Verantwortung des Anrufs allocate, deallocate, construct und destruct ist zu seinen Benutzern (was bedeutet, hier, std::vector). Aus Ihrer Sicht wird es automatisch sein, worauf es ankommt.

  • Was ist das std :: allocator tun? - Deklariert es vom Stapel oder vom Heap?

std::allocator ist beauftragt, über die Definition der globalen new Betreiber zuzuordnen ::operator new(size_t) verwenden, so hängt es. Im Allgemeinen bedeutet dies den Heap. Der Stack ist für Objekte mit automatischer Speicherdauer.

  • (folgen aus vorherigen Frage nach oben): Wenn ich ein Element in dem Stapel auf die Datenstruktur erklärt kopieren ist es immer noch in dem Heap erklärt?

Wenn Sie ein Element kopieren, dann eine Kopie zugeordnet ist, wo Sie es kopieren. Hier bedeutet es, ein Element vom Stapel auf den Heap zu kopieren. Sie haben dann zwei Kopien des Objekts, dh Änderungen an einer Kopie werden nicht auf der anderen wiedergegeben.

Beachten Sie jedoch, dass wir die über Standard Kopiermodus sprechen, das ist ein flache Kopie. Wenn Sie ein Objekt kopieren, wird alles gut kopiert. Wenn Sie einen Zeiger kopieren, wird nur der Zeiger kopiert, nicht die Daten, auf die verwiesen wird.

+0

Kannst du mir sagen, wo ist std :: allocator mandated: :: operator new? Ich kann die Referenz im Standard nicht finden. – Simone

+0

@Simone: Ich stützte mich auf diese Antwort von Steve Jessop http://stackoverflow.com/questions/4159641/does-stl-vector-use-new-and-delete-for-memory-allocation-by-default/4159686 # 4159686, die sich nicht auf den endgültigen Entwurf von C++ 0x beziehen, soweit ich sehen kann (für 20.4 geht es um Tupel dort). Ich konnte es in diesem Entwurf nicht finden. Ich habe die Unterschrift des Bedieners präzisiert. –

0

Ihre Antworten:

  • Ja, sind Sie richtig. Wie auch immer, wenn der Vorlagentyp des Containers ein Zeiger ist, wie in Ihrem Fall, reserviert der Container Speicher für den Zeiger und nicht für das Objekt, auf das der Zeiger zeigt!

  • Es ist bis zur Implementierung, in der $ 20,2.5 des Standards sind die Anforderungen der Allokatoren beschrieben.

  • Da Sie Zeiger speichern, fürchte ich, die Antwort auf diese Frage würde Sie verwirren. Wenn Sie in dem Container einen Zeiger auf ein Objekt kopieren, das in dem Stapel zugeordnet wird, wird Ihr Objekt in dem Stapel verbleiben. Sobald Sie den Bereich verlassen, wird er zerstört und Sie haben einen ungültigen Zeiger im Container.

HTH

Verwandte Themen