【问题标题】:Where will this be allocated, stack or heap? (C++)这将在哪里分配,堆栈或堆? (C++)
【发布时间】:2014-10-04 20:36:18
【问题描述】:

如果我有以下代码:

class xyzNode
{
public:
    int x;
    int y;
    int z;
    // Other data
};

我主要是这样做的:

xyzNode * example = new xyzNode;

我知道对象本身会被分配到堆上,因为我使用的是“new”操作符,但是对象内部的变量也会被分配到堆上吗?我只是想确认一下,因为我没有为他们使用 new 运算符。

谢谢!

【问题讨论】:

  • 是的,所有对象及其成员变量都将在堆上分配。
  • 您正在区分“对象”和“它的内部变量”,这实际上并不存在。
  • 嘿,亲爱的同事,您为什么要否决这个问题?是的,它确实显示了 OP 的基本误解,但是这些问题如何违反 SO 政策?
  • @HonzaZidek 反对并不意味着“反对政策”。将鼠标悬停在向下投票箭头上以查看其含义。反对政策的问题将获得近距离投票。
  • @Matt:我知道 OP 正在学习一些文本,但需要额外的帮助来理解其含义。他的问题远不是常见的愚蠢的问题,这里是我的家庭作业,而不是我的问题!它并不表明缺乏 OP 自己的工作。在我看来,许多 SE 网站的人对初学者都非常傲慢,并且仅仅因为他们认为这些问题太琐碎而投反对票。

标签: c++ object heap-memory new-operator stack-memory


【解决方案1】:

对象(只是它的成员变量加上一些其他信息)将被放置在堆上,因此成员变量也将在那里。但是,指针example 的内存将在堆栈上。

【讨论】:

    【解决方案2】:

    对象的内存由其成员变量组成,因此这些变量将存在于分配对象的任何内存块中。

    xyzNode * example = new xyzNode;
    

    这会在堆上分配一个足够大的内存块以容纳xyzNode 对象,然后在该块中构造对象,因此其成员存在于堆上。

    xyzNode example;
    

    这会在堆栈上分配一个足够大的内存块以容纳xyzNode 对象,然后在该块中构造该对象,因此其成员存在于堆栈中。

    这是一个不太常见的例子:

    unsigned char buffer[sizeof(xyzNode)];
    xyzNode * example = new(buffer) xyzNode;
    

    成员存在于栈中,因为placement-new正在被使用,它在指定的缓冲区内构造对象,该缓冲区在栈上。

    【讨论】:

    • 感谢您的详尽回答!我不知道placement-new,很高兴知道! :)
    • @Remy:我会害怕在没有明确警告的情况下显示placement-new 使用它可能会导致什么!这就像给一个 7 岁男孩一把上膛的枪 :-)
    • @Vladimir:如果您分配的缓冲区大于可用堆栈空间,则可以。
    • @Vladimir:嗯,有点:) 它不会在buffer 变量的有效性范围内存活。
    • @HonzaZidek 哦,是的!这是有道理的:)谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2012-10-04
    相关资源
    最近更新 更多