如果在C++中在一个块中创建对象,它会被存储在哪里

如果在C++中在一个块中创建对象,它会被存储在哪里

对象可以存储在两个部分的内存中:

  1. - 栈内存被声明在块/函数中的所有成员使用。注意,main函数也是一个函数。
  2. - 此内存未被使用,可用于在运行时动态分配内存。

在块或函数内创建的对象的作用域仅限于创建它的块内。

  • 在块内创建的对象将存储在 中,并且当函数/块退出时,对象将被销毁并从栈中删除。
  • 但是,如果我们通过 动态内存分配 在运行时创建对象,则对象将存储在 中。这是使用 new 运算符完成的。在这种情况下,我们需要使用 delete 运算符显式地销毁对象。

示例:

输出:
Inside Block1…
矩形的长度是:2
矩形的宽度是:3
矩形的析构函数
随着块的退出,存储在栈中的对象的析构函数被自动调用。


Inside Block2
矩形的长度是:5
矩形的宽度是:6
矩形的析构函数
矩形的长度是:0
矩形的宽度是:0

以下是显示对象存储位置的程序:

// C++程序实现
#include 
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 << "矩形的析构函数" << endl;
    }

    int getLength()
    {
        return length;
    }

    int getWidth()
    {
        return width;
    }
};

int main()
{
    // 对象创建在块内
    {
        Rectangle r(2, 3); // r 存储在栈中
        cout << "在块1中..." << endl;
        cout << "矩形的长度为: "
            << r.getLength() << endl;
        cout << "矩形的宽度为:"
            << r.getWidth() << endl;
    }

    cout << "随着块的退出,存储在栈中的对象的析构函数\n"
        << "将自动调用。" << endl;

        /*
        // 取消此注释并运行一次,您将获得
        // 编译错误,因为对象不在作用域内
        cout<<"矩形的长度为: "<getLength() << endl;
        cout << "矩形的宽度为:"
            << ptr3->getWidth() << endl;

        // 注释下面一行代码并
        // 取消注释*重要行*
        // 然后检查对象将保持
        // 存活在块外面。

        // 显式销毁在堆中存储的对象
        delete ptr3;
    }

    cout << "矩形的长度为: "
        << ptr2->getLength() << endl;

    cout << "矩形的宽度为:"
        << ptr2->getWidth() << endl;

    // delete ptr2; /* 重要行*/

    return 0;
}  

输出

在块1中...
矩形的长度为: 2
矩形的宽度为:3
矩形的析构函数
随着块的退出,存储在栈中的对象的析构函数
将自动调用。
********************************************
在块2中
矩形的长度为: 5
矩形的宽度为:6
矩形的析构函数
矩形的长度为: 0
矩形的宽度为:0

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程