2011-01-06 3 views
0
class AClass 
{ 
    // ... 
} 

~Wie kann ich einem Vektor weitere Objekte einer Klasse hinzufügen, ohne die dynamische Speicherzuweisung vorzunehmen?

class AnotherClass 
{ 
    public: 
     // ... 
     void AMethod() 
     { 
      // ... 
      AClass * ac = new AClass(); // Dynamic memory allocation here 
      m_Objects.push_back(ac); 
      // ... 
     } 
     // ... 
    private: 
     // ... 
     std::vector<AClass *> m_Objects; 
     // ... 
} 

I m_Objects neue Objekte von AClass zu dem Vektor hinzugefügt werden soll.
Gibt es eine andere Möglichkeit, dies ohne dynamische Speicherzuweisung zu tun?

+3

Warum nicht 'AClass' Objekte im Vektor statt Zeiger auf' AClass' Objekte speichern? (Ja, es gibt immer noch eine dynamische Zuweisung für den zugrunde liegenden Speicher des "Vektors", aber nicht für die einzelnen Elemente.) –

+1

Gibt es einen Grund, warum Sie keine dynamische Speicherzuweisung vornehmen möchten? –

+1

@Sanjit: Weil es nicht sehr wünschenswert ist. Dies kann zu Speicherverlust führen. – hkBattousai

Antwort

4

Es gibt zwei Dinge verursacht dynamische Speicherzuordnungen hier:

  1. vector::push_back
  2. new AClass()

Hier ist eine Idee, wie dynamische Speicherzuordnungen zu reduzieren.

Erster Schritt ist m_Objects.reserve(N); im AnotherClass Konstruktor aufzurufen, wo N die maximale Anzahl von AClass Objekte, die Sie zu einem bestimmten Zeitpunkt halten wollen. Dies reserviert genügend Speicher, um die Notwendigkeit für dynamische Zuordnungen durch vector::push_back zu entfernen.

Zweiter Schritt besteht darin, Objekte anstelle von Zeigern zu enthalten, d. H. Es wird std::vector<AClass> statt std::vector<AClass*> eingegeben. Auf diese Weise können Sie new überspringen und direkt das neue Objekt erstellen, indem Sie den Behälter wächst:

m_Objects.resize(m_Objects.size() + 1); 

Nun wird es keine dynamische Zuweisung sein, wenn Sie ein neues Objekt hinzufügen.

2

Wenn Sie meinen "kann ich neue Objekte zur Laufzeit erstellen, ohne dynamische Zuordnung zu tun?" dann ist die Antwort nein. Das ist die dynamische Zuordnung.

Wenn Sie einige erstellen möchten, bevor sie sofort benötigt werden, indem Sie sie in großen Mengen im Voraus erstellen, dann ist das plausibel. Ordnen Sie einfach eine große Zahl zu und ziehen Sie sie dann nach Bedarf aus einem Array oder Vektor heraus.

+0

@Keith Irwin: Ich möchte zur Laufzeit erstellen. – hkBattousai

+0

@hkBattousai: Das ist die Definition der dynamischen Zuordnung. –

+1

@Tomalak: Dynamische Zuweisung bedeutet in der Regel die Zuweisung von Speicher aus dem Heap. Speicherzuordnung und Objektinstanziierung sind zwei getrennte Dinge (auch wenn sie normalerweise zusammengehören). Einfach die Platzierung neu suchen. –

1

Nicht so lange wie m_Objects ist ein vector von Zeiger, es sei denn, Sie einen Zeiger auf einen automatischen (Stack) Variable speichern waren. Aber das wäre zweifellos eine sehr schlechte Idee.

1

Es gibt nur zwei Möglichkeiten, Objekte zur Laufzeit zuzuordnen: dynamisch auf dem Heap und auf dem Aufruf-Stack.

Es ist möglich, mehrere Objekte (lokale Variablen) in einem Funktionsblock zu instanziieren, indem Sie die Funktion rekursiv aufrufen und diese Stapelobjekte zu Ihrem Vektor hinzufügen. Aber ich bin mir ziemlich sicher, dass du das nicht willst.

Das bedeutet, dass die einzige andere Möglichkeit ist, new zu verwenden, um die neuen Objekte dynamisch zu erstellen.

+1

Heap und Stack sind veraltete, verwirrende und ungenaue Begriffe für die Speicherdauer. C++ gibt nicht an, wo diese Objekte gespeichert werden müssen, und heutzutage ist es nicht unbedingt der Fall, dass entweder "der Stapel" oder "der Haufen" ist. Seien Sie genau: Objekte mit automatischer Speicherdauer werden automatisch zerstört, wenn der Block, in dem sie erstellt wurden, beendet wird. Objekte mit dynamischer Speicherdauer werden mit einem neuen Ausdruck erstellt. Ihre Lebensdauer dauert so lange, bis sie mit einem Löschausdruck zerstört werden. –

Verwandte Themen