如果我有以下代码:
class xyzNode
{
public:
int x;
int y;
int z;
// Other data
};
主要是我这样做:
xyzNode * example = new xyzNode;
我知道对象本身将在堆上分配,因为我正在使用“new”运算符,但是对象内的内部变量是否也会在堆上分配?我只是想确定,因为我没有使用新的运算符。
谢谢!
答案 0 :(得分:3)
Object(它只是其成员变量加上一些其他信息)将被放置在堆上,因此成员变量也将存在。然而,指针example
的内存将在堆栈中。
答案 1 :(得分:1)
对象的内存由其成员变量组成,因此这些变量将存在于分配对象的任何内存块中。
xyzNode * example = new xyzNode;
这会在堆上分配一个足以容纳xyzNode
对象的内存块,然后构造该块中的对象,从而使其成员存在于堆上。
xyzNode example;
这会在堆栈上分配一个足以容纳xyzNode
对象的内存块,然后构造该块中的对象,从而使其成员存在于堆栈中。
这是一个不太常见的例子:
unsigned char buffer[sizeof(xyzNode)];
xyzNode * example = new(buffer) xyzNode;
成员存在于堆栈中,因为正在使用placement-new
,并且它在堆栈中的指定缓冲区内构造对象。