如果在C ++的块内创建对象,该对象存储在哪里?

在本节中,我们将讨论在编译C ++程序时变量和对象在内存中的存储位置。众所周知,有两个部分可以存储对象-

  • 堆栈-在内存块中声明的所有成员,都存储在堆栈部分中。main函数也是一个函数,因此其中的元素将存储在堆栈中。

  • -当动态分配一些对象时,则将其存储在堆部分中。

在块或函数内部声明的对象范围仅限于在其中创建对象的块。当在块内创建对象时,该对象将存储在堆栈中;当控件退出该块或函数时,该对象将被删除或销毁。

对于动态分配的对象(在运行时),该对象将存储在堆中。这是在新运算符的帮助下完成的。要销毁该对象,我们必须使用del关键字显式销毁它。

示例

让我们看下面的实现以更好地理解-

#include <iostream>
using namespace std;
class Box {
   int width;
   int length;
public:
   Box(int length = 0, int width = 0) {
      this->length = length;
      this->width = width;
   }
   ~Box() {
      cout << "Box is destroying" << endl;
   }
   int get_len() {
      return length;
   }
   int get_width() {
      return width;
   }
};
int main() {
   {
      Box b(2, 3); // b will be stored in the stack
      cout << "盒子尺寸为:" << endl;
      cout << "Length : " << b.get_len() << endl;
      cout << "Width :" << b.get_width() << endl;
   }
   cout << "\tExitting block, destructor" << endl;
   cout << "\tAutomatically call for the object stored in stack." << endl;
   Box* box_ptr;{
      //对象将放置在堆部分中,并在本地
      pointer variable will be stored inside stack
      Box* box_ptr1 = new Box(5, 6);
      box_ptr = box_ptr1;
      cout << "---------------------------------------------------" << endl;
      cout << "方框2的尺寸为:" << endl;
      cout << "length : " << box_ptr1->get_len() << endl;
      cout << "width :" << box_ptr1->get_width() << endl;
      delete box_ptr1;
   }
   cout << "length of box2 : " << box_ptr->get_len() << endl;
   cout << "box2的宽度:" << box_ptr->get_width() << endl;
}

输出结果

盒子尺寸为:
Length : 2
Width :3
Box is destroying
      Exitting block, destructor
      Automatically call for the object stored in stack.
---------------------------------------------------
方框2的尺寸为:
length : 5
width :6
Box is destroying
length of box2 : 0
box2的宽度:0
猜你喜欢