采用以下简单代码。 d
是堆栈上指向堆上demo
对象的指针。该对象包含val
。这似乎是类的上下文中的堆栈变量,但是对象是在堆上分配的。 。 。 。那么究竟在哪里val
?
class demo
{
int val;
public:
demo() : val(5) {};
};
demo* d = new demo();
答案 0 :(得分:2)
变量val
位于堆上,因为它是位于堆上的对象的一部分。每个线程都有自己的堆栈,但单个对象却没有。只有在静态声明val
时,d
才会位于堆栈中。
答案 1 :(得分:1)
无论对象是存储在堆栈还是堆中,val
始终位于demo对象的同一内存地址中,因为它是第一个成员。
§1.8.6
除非对象是零字段或零大小的基类子对象,否则该对象的地址是它占用的第一个字节的地址。两个不同的对象既不是位字段也不是零大小的基类子对象应具有不同的地址。