变量的“存储位置”是什么?一个是在标准的以下部分中使用:
如果程序以静态结束T类型对象的生命周期 (3.7.1),线程(3.7.2)或自动(3.7.3)存储持续时间和if T有一个非平凡的析构函数,41程序必须确保一个 原始类型的对象占用相同的存储位置时 隐式析构函数调用发生;否则的行为 该程序未定义。
请考虑以下代码:
#include <iostream>
using namespace std;
struct A
{
int a = 5;
A(){ cout << "A()" << endl; }
~A(){ cout << "~A()" << endl; }
};
struct B : A{ };
int main()
{
A a;
new (&a) B;
}
原始对象的存储位置是否在new (&a) B
行更改了?我知道在这一行,a
的生命周期结束了。生命周期结束如何限制“更改存储位置”?我对这些概念感到困惑。
答案 0 :(得分:3)
“存储位置”是存储对象的内存部分(在抽象机器中 - 实际上可以是RAM,缓存,寄存器,优化输出......)。
对象的生命周期结束后,它不再存在,因此它没有存储位置。 “更改存储位置”是不可能的(并且标准报价中不会出现该文本)。
在此示例中,存储位置是从内存地址sizeof(int)
开始的&a
字节。最初它有一个名为a
的对象;然后它有一个新对象(也称为a
)。
答案 1 :(得分:1)
变量的“存储位置”是什么?
用于存储对象数据的内存区域。这对于对象生存期是固定的(优化可能意味着数据有时会缓存在寄存器或其他任何内容中;但程序必须表现得好像对象在其整个生命周期中都处于固定的内存位置。)
原始对象的存储位置是否在
new (&a) B
行更改了?
不,对象的位置永远不会改变。这将在同一内存位置创建一个不同类型的新对象。换句话说,它结束了原始对象的生命周期 - 不调用它的析构函数 - 并将内存重用于另一个对象。
引用说,由于变量具有自动存储持续时间,因此A
的析构函数将在超出范围时被调用。如果那里不再有有效的A
对象,这将是一件非常糟糕的事情。因此规则是你必须在它被销毁之前恢复A
。