2009-10-21 7 views
11

den folgenden Code vor:Erstellen von Array von Objekten auf dem Stapel und Haufen

class myarray 
{ 
    int i; 

    public: 
      myarray(int a) : i(a){ } 

} 

Wie kann man ein Array von Objekten von myarray auf dem Stapel erstellen und wie Sie ein Array von Objekten auf dem Heap erstellen?

+0

Ist das eine Hausaufgabenfrage? Es klingt wie einer. – Amber

+0

Nein ... Das ist keine Hausaufgabenfrage ... Gefunden im Internet während der Vorbereitung für mein Vorstellungsgespräch .... :) –

Antwort

34

Sie können ein Array von Objekten auf dem Stapel über erstellen:

myarray stackArray[100]; // 100 objects 

Und auf dem Heap (oder "Frees"):

myarray* heapArray = new myarray[100]; 
delete [] heapArray; // when you're done 

Aber es ist am besten Speicher nicht selbst verwalten. Stattdessen verwenden ein std::vector:

#include <vector> 
std::vector<myarray> bestArray(100); 

Vektor, der ein dynamisches Array ist, das (Standard) Elemente aus dem Heap zuordnet. ††


Da Ihre Klasse keinen Standardkonstruktor hat, erstellen sie auf den Stapel benötigen Sie bitte den Compiler zu informieren, was in den Konstruktor übergeben:

myarray stackArray[3] = { 1, 2, 3 }; 

Oder mit einem Vektor :

// C++11: 
std::vector<myarray> bestArray{ 1, 2, 3 }; 

// C++03: 
std::vector<myarray> bestArray; 
bestArray.push_back(myarray(1)); 
bestArray.push_back(myarray(2)); 
bestArray.push_back(myarray(3)); 

natürlich könnte man es immer einen Standardkonstruktor geben:

class myarray 
{ 
    int i;  
public: 
    myarray(int a = 0) : 
    i(a) 
    {} 
}; 

† Für die Pedanten: C++ hat nicht wirklich einen "Stapel" oder "Haufen"/"Frees". Was wir haben, ist die "automatische Speicherung" und "dynamische Speicherung". In der Praxis richtet sich dies an der Stapelzuordnung und der Heap-Zuweisung aus.

†† Wenn Sie eine dynamische Zuordnung aus dem Stapel möchten, müssen Sie eine maximale Größe definieren (Stapelspeicher ist der Zeit bekannt), und geben Sie dem Vektor einen neuen Zuordner, damit er stattdessen den Stapel verwendet.

+0

können Sie '_alloca()' verwenden, um variable Mengen an Speicher auf dem Stapel dynamisch zuzuweisen ... – Crashworks

+0

@GMan - Es ist eine nicht standardisierte, aber weit verbreitete C-Funktion. –

+2

Es funktioniert in C++ genauso wie in C; Wenn es eine Standardmethode gibt, dem Compiler mitzuteilen, N Bytes auf dem Stack zuzuweisen, wobei N zur Laufzeit bestimmt wird, weiß ich nicht, was es ist. – Crashworks

2

Wenn Sie ein Array von Objekten der Klasse myarray erstellen (entweder im Stapel oder im Heap), müssen Sie einen Standardkonstruktor definieren.

Es gibt keine Möglichkeit, Argumente an den Konstruktor zu übergeben, wenn ein Array von Objekten erstellt wird.

0

Ich weiß, wie Objekt mit aus dem Standard-Konstruktor erstellen, sondern nur auf Stapel:

Angenommen, Sie 10 Objekte für MyArray Klasse mit a = 1..10 erstellen möchten:

MyArray objArray[] = { MyArray[1], MyArray[2]......MyArray[10]} 

Keine Notwendigkeit zu nennen der Destruktor, weil sie im Stack erstellt werden.

+1

Syntax? Verwenden Sie runde Klammern, verwendet die folgenden temporarie: MyArray objArray [] = {MyArray (0), MyArray (88), usw.,} – Hoven

+0

Wie bereits erwähnt, würde dies nicht kompilieren. –

-1
#include <stdio.h> 
class A 
{ 
public: 
    A(int a){ 
     printf("\nConstructor Called : %d\n",a); 
     aM = a; 
     } 
    ~A(){ 
    printf("\ndestructor Called : %d\n",aM); 
} 
private: 
    int aM; 
}; 

int main() 
{                         
    A **a = new A*[10]; 
    for (int i = 0;i<10;i++) 
    a[i] = new A(i+1); 
    for (int i = 0;i<10;i++) 
     delete a[i];// = new A(i+1);                      

    delete []a; 
} 
+0

Das ist die Half-Hälfte ... –

+0

Ich sehe auch nicht, wo gibt es ein Array von A, außer Objekte zählen als Arrays der Größe 1. –

3

Da C++ 11 std::array<T,size> für Arrays auf dem Stapel zugeordnet verfügbar ist.Es umschließt T[size] mit der Schnittstelle std::vector, aber die meisten Methoden sind constexpr. Der Nachteil ist, dass man nie weiß, wann man den Stack überläuft.

std::array<myarray, 3> stack_array; // Size must be declared explicitly.VLAs 

Für zugeordnet Arrays mit Heap-Speicher Verwendung std::vector<T>. Wenn Sie keinen benutzerdefinierten Zuordner angeben, verwendet die Standardimplementierung Heap-Speicher, um die Array-Mitglieder zuzuordnen. C zu gebrauchen VLAs oder C++ 's new,

std::vector<myarray> heap_array (3); // Size is optional. 

Hinweis, dass in beiden Fällen ist ein Standardkonstruktor erforderlich, um das Array zu initialisieren, so müssen Sie

myarray::myarray() { ... } 

Es gibt auch Optionen definieren, aber Sie sollten Unterlassen Sie es, sie so oft wie möglich zu verwenden, da ihre Verwendung den Code anfällig für Segmentierungsfehler und Speicherlecks macht.

+0

'std :: array' ist gut, weil - wie jeder andere gut programmierte Wrapper um a 'T [n'] - es kennt seine eigene Größe (über Vorlagenmagie), kann auf angenehmere Weise weitergegeben werden, kann von Funktionen zurückgegeben werden, etc. Ich mochte" man weiß nie, wann man den Stapel überfließt " - Nun, außer wenn es eine völlig zufällige Verfälschung von Nicht-Stack-Speicher verursacht und sich selbst sehr offensichtlich macht :-), aber es ist natürlich am besten zu vermeiden, dass große Arrays auf dem Stack zugewiesen werden. –