如果在C++中在一个块中创建对象,它会被存储在哪里
对象可以存储在两个部分的内存中:
- 栈 - 栈内存被声明在块/函数中的所有成员使用。注意,main函数也是一个函数。
- 堆 - 此内存未被使用,可用于在运行时动态分配内存。
在块或函数内创建的对象的作用域仅限于创建它的块内。
- 在块内创建的对象将存储在 栈 中,并且当函数/块退出时,对象将被销毁并从栈中删除。
- 但是,如果我们通过 动态内存分配 在运行时创建对象,则对象将存储在 堆 中。这是使用 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