2009-10-21 14 views
11

Considere el siguiente código:Creación de matriz de objetos en la pila y montón

class myarray 
{ 
    int i; 

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

} 

Cómo se puede crear una matriz de objetos de myarray en la pila y cómo se puede crear una matriz de objetos en el montón?

+0

¿Es esta una pregunta de tarea? Suena como uno. – Amber

+0

No ... Esto no es una pregunta para la tarea ... Lo encontré en Internet mientras me preparaba para mi entrevista de trabajo ... :) –

Respuesta

34

Puede crear una matriz de objetos en la pila a través de:

myarray stackArray[100]; // 100 objects 

Y en el montón (o "almacén libre"):

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

Pero es mejor no gestionas la memoria tú mismo En su lugar, utilizar un std::vector:

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

Un vector es una matriz dinámica, que (por defecto) asigna los elementos de la pila. ††


Debido a que su clase no tiene constructor por defecto, para crear en la pila es necesario dejar que el compilador sabe qué pasa en el constructor:

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

O con un vector :

// 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)); 

Por supuesto, siempre se puede dar un constructor por defecto: 012

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

† Para los pedantes: C++ no tiene realmente una "pila" o "montón"/"almacén libre". Lo que tenemos es duración de "almacenamiento automático" y "almacenamiento dinámico". En la práctica, esto se alinea con la asignación de pila y la asignación de pila.

†† Si desea asignar "dinámicamente" de la pila, necesitará definir un tamaño máximo (se conoce el almacenamiento de la pila antes de tiempo), y luego darle al vector un nuevo asignador para que use la pila en su lugar.

+0

puedes usar '_alloca()' para asignar dinámicamente cantidades variables de memoria en la pila ... – Crashworks

+0

@GMan - Es una función C no estándar pero ampliamente provista. –

+2

Funciona de la misma manera en C++ que en C; si hay una forma más estándar de decirle al compilador que asigne N bytes en la pila donde se determina N en tiempo de ejecución, no sé cuál es. – Crashworks

2

Si crea una matriz de objetos de clase myarray (ya sea en la pila o en el montón) tendría que definir un constructor predeterminado.

No hay forma de pasar argumentos al constructor al crear una matriz de objetos.

0

sé cómo crear objetos con fuera del constructor por defecto, pero sólo en la pila:

Supongamos que desea crear 10 objetos de la clase MiMatriz con a = 1..10:

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

No hay necesidad de llamar el destructor, porque se crean en la pila.

+1

Sintaxis? Use corchetes, las siguientes utilizaciones temporales: MyArray objArray [] = {MyArray (0), MyArray (88), etc.,} – Hoven

+0

Como se mencionó, esto no compilaría. –

-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

Esa es la mitad del montón ... –

+0

Tampoco veo dónde hay una matriz de A, a menos que los objetos cuenten como matrices de tamaño 1. –

3

Dado que C++ 11 std::array<T,size> está disponible para las matrices asignadas en la pila.Envuelve T[size] proporcionando la interfaz de std::vector, pero la mayoría de los métodos son constexpr. La desventaja aquí es que nunca se sabe cuando se desborda la pila.

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

Para las matrices asignados con el uso de memoria montón std::vector<T>. A menos que especifique un asignador personalizado, la implementación estándar utilizará la memoria de pila para asignar los miembros de la matriz.

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

Nota que en ambos casos se requiere un constructor por defecto para inicializar la matriz, por lo que debe definir

myarray::myarray() { ... } 

También hay opciones para utilizar de VLAs C o C++ 's new, pero debe abstenerse de usarlos tanto como sea posible, ya que su uso hace que el código sea propenso a errores de segmentación y pérdidas de memoria.

+0

'std :: array' es bueno porque, como cualquier otro envoltorio bien programado un 'T [n'] - conoce su propio tamaño (a través de la magia de plantilla), se puede pasar de una forma más agradable, puede devolverse desde funciones, etc. Me gustó" nunca se sabe cuando se desborda la pila " - Bueno, excepto cuando causa una corrupción totalmente aleatoria de la memoria que no es de la pila y se hace muy obvio :-) pero, por supuesto, es mejor evitar asignar enormes matrices en la pila. –

Cuestiones relacionadas