¿Dónde se almacena un objeto si se crea dentro de un bloque en C++?

Hay dos partes de la memoria en las que se puede almacenar un objeto:

  1. pila : la memoria de la pila es utilizada por todos los miembros que se declaran dentro de bloques/funciones. Tenga en cuenta que el principal también es una función.
  2. montón : esta memoria no se usa y se puede usar para asignar dinámicamente la memoria en tiempo de ejecución.

El alcance del objeto creado dentro de un bloque o una función se limita al bloque en el que se crea.

  • El objeto creado dentro del bloque se almacenará en la pila y el objeto se destruirá y eliminará de la pila cuando la función/bloque salga.
  • Pero si creamos el objeto en tiempo de ejecución, es decir, mediante la asignación de memoria dinámica , el objeto se almacenará en el montón . Esto se hace con la ayuda del nuevo operador. En este caso, necesitamos destruir explícitamente el objeto usando el operador de eliminación .

Ejemplos:

Output:
Inside Block1...
length of rectangle is : 2
width  of rectangle  is :3
Destructor of rectangle
with the exit of the block, destructor called
automatically for the object stored in stack.
*********************************************
Inside Block2
length of rectangle is : 5
width of rectangle  is :6
Destructor of rectangle
length of rectangle is : 0
width of rectangle is :0

A continuación se muestra el programa para mostrar dónde se almacena el objeto:

// C++ program for required implementation
#include <iostream>
using namespace std;
  
class Rectangle {
    int width;
    int length;
  
public:
    Rectangle()
    {
        length = 0;
        width = 0;
    }
  
    Rectangle(int l, int w)
    {
        length = l;
        width = w;
    }
  
    ~Rectangle()
    {
        cout << "Destructor of rectangle" << endl;
    }
  
    int getLength()
    {
        return length;
    }
  
    int getWidth()
    {
        return width;
    }
};
  
int main()
{
    // Object creation inside block
    {
  
        Rectangle r(2, 3); // r is stored on stack
        cout << "Inside Block1..." << endl;
        cout << "length of rectangle is : " 
             << r.getLength() << endl;
        cout << "width  of rectangle  is :" 
             << r.getWidth() << endl;
    }
  
    cout << " with the exit of the block, destructor\n"
         << " called automatically for the object stored in stack." 
         << endl;
  
         /* 
          // uncomment  this code and run once you will get
         // the compilation error because the object is not in scope
         cout<<"length of rectangle is : "<< r.getLength();
         cout<< "width of rectangle is :" << r.getWidth();
        */
           
  
    Rectangle* ptr2;
    {
        // object will be stored in heap  
        // and pointer variable since its local
        // to block will be stored in the stack
  
        Rectangle* ptr3 = new Rectangle(5, 6);
        ptr2 = ptr3;
        cout << "********************************************"
             << endl;
        cout << "Inside Block2" << endl;
        cout << "length of rectangle is : " 
             << ptr3->getLength() << endl;
        cout << "width of rectangle  is :" 
             << ptr3->getWidth() << endl;
  
        // comment below line of code and 
        // uncomment *important line* 
        // and then check the object will remain
        // alive outside the block.
  
        // explicitly destroy object stored on the heap
        delete ptr3; 
    }
  
    cout << "length of rectangle is : " 
         << ptr2->getLength() << endl;
  
    cout << "width of rectangle is :" 
         << ptr2->getWidth() << endl;
      
     // delete ptr2;   /* important line*/
  
    return 0;
}
Producción:

Inside Block1...
length of rectangle is : 2
width  of rectangle  is :3
Destructor of rectangle
 with the exit of the block, destructor
 called automatically for the object stored in stack.
********************************************
Inside Block2
length of rectangle is : 5
width of rectangle  is :6
Destructor of rectangle
length of rectangle is : 0
width of rectangle is :0

Publicación traducida automáticamente

Artículo escrito por Shagun Garg y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *