Hay dos partes de la memoria en las que se puede almacenar un objeto:
- 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.
- 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