Crear una matriz de objetos en la pila y el montón

5 minutos de lectura

Crear una matriz de objetos en la pila y el
mango_de_luz

Considere el siguiente código:

class myarray
{
    int i;

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

}

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

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

    – Ámbar

    21 oct.

  • No… Esta no es una pregunta de tarea… Encontré esto en Internet mientras me preparaba para mi entrevista de trabajo… 🙂

    – Mango_luz

    21 oct.

1642425248 707 Crear una matriz de objetos en la pila y el
GManNickG

Puede crear una matriz de objetos en la pila vía:

myarray stackArray[100]; // 100 objects

Y en el montón (o “tienda libre”):

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

Pero es mejor no administrar la memoria usted mismo. En su lugar, utilice un estándar::vector:

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

Un vector es una matriz dinámica que (de forma predeterminada) asigna elementos del montón.††


Debido a que su clase no tiene un constructor predeterminado, para crearla en la pila, debe informar al compilador qué pasar al 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 puedes darle un constructor predeterminado:

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

† Para los pedantes: C++ realmente no tiene una “pila” o “montón” https://stackoverflow.com/”freestore”. 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 almacenamiento dinámico.

†† Si desea una asignación “dinámica” de la pila, debe definir un tamaño máximo (el almacenamiento de la pila se conoce con anticipación) y luego darle al vector un nuevo asignador para que use la pila en su lugar.

  • puedes usar _alloca() para asignar dinámicamente cantidades variables de memoria en la pila…

    – Crashworks

    21 oct.

  • @GMan: es una función C no estándar pero ampliamente proporcionada.

    – Chris Lutz

    21 oct.

  • 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 N se determina en tiempo de ejecución, no sé cuál es.

    – Crashworks

    21 oct.

  • solo un pequeño detalle tal vez, no estoy seguro si vector especifica que los elementos estarán en el montón. por ejemplo clasico string La implementación mantiene los caracteres dentro del propio objeto hasta 8 o 16 caracteres en general. luego, cuando necesita alargarse, cambia a montón. Entonces si el string el objeto en sí está en la pila, los datos también están en la pila, para todas las cadenas menores de 16. Uno podría imaginar que el vector podría actuar de la misma manera en las implementaciones, ¿no?

    – v.oddou

    24 feb.

  • ¿La matriz de objetos no debería ser un puntero doble? Dado que cada objeto es un puntero cuando se guarda en el montón

    – filip

    04 jul. 19 en 08:56

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

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

Para arreglos asignados con uso de memoria en montón std::vector<T>. A menos que especifique un asignador personalizado, la implementación estándar utilizará la memoria de almacenamiento dinámico 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 predeterminado para inicializar la matriz, por lo que debe definir

myarray::myarray() { ... }

También hay opciones para usar C VLA o C++ new, pero debe abstenerse de usarlos tanto como sea posible, porque su uso hace que el código sea propenso a fallas de segmentación y pérdidas de memoria.

  • std::array es bueno porque, como cualquier otro envoltorio bien programado alrededor de un T[n]- conoce su propio tamaño (a través de la magia de la plantilla), se puede pasar de una manera más agradable, se puede devolver desde funciones, etc. Me gustó “nunca se sabe cuándo se desborda la pila” – bueno, excepto cuando causa una corrupción totalmente aleatoria de la memoria que no es de pila y se vuelve muy obvio 🙂 pero, por supuesto, es mejor evitar asignar grandes arreglos en la pila.

    – subrayado_d

    15 feb. 16 a las 13:45

Si crea una matriz de objetos de la clase myarray (ya sea en la pila o en el montón), deberá definir un constructor predeterminado.

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

1642425248 6 Crear una matriz de objetos en la pila y el
Alok

Sé cómo crear un objeto fuera del constructor predeterminado, pero solo en la pila:

Suponga que desea crear 10 objetos para la clase MyArray con a = 1..10:

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

No es necesario llamar al destructor, porque se crean en la pila.

#include <stdio.h>
class A
{
public:
  A(int a){ 
       printf("nConstructor Called : %dn",a); 
       aM = a;
      }  
  ~A(){ 
    printf("ndestructor Called : %dn",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;
}

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

    – Peter – Reincorporar a Mónica

    09 nov.

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

    – Peter – Reincorporar a Mónica

    09 nov.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad