【问题标题】:When should I use "new"? [duplicate]我什么时候应该使用“新”? [复制]
【发布时间】:2012-03-18 03:07:09
【问题描述】:

可能重复:
When should I use the new keyword in C++?

我不知道案例1和案例2的区别:

我在下面定义了一个结构:

struct Graph {
    int ID;
}

案例一:

Graph g;
g.ID = 1;

案例2:

Graph* g = new G();
g.ID = 1;

这两种情况是一样的吗?有什么区别?

【问题讨论】:

  • 如果在 struct 定义的末尾添加分号,则 case 1 可以编译。

标签: c++


【解决方案1】:

情况1,g使用的内存是在栈上分配的,也就是说它所在的函数返回时会自动释放。

在情况 2 中,g 使用的内存是在堆上分配的,这意味着它只有在使用 delete 运算符显式删除时才会被释放。

另外,在情况 2 中,因为 g 是一个指针,你应该使用 -> 操作符访问 g 的字段:

g->ID = 1;

【讨论】:

    【解决方案2】:

    在情况 2 中,您的意思是 new Graph,然后是 g->ID = 1。尝试从 http://en.wikipedia.org/wiki/New_(C%2B%2B) 开始。小故事,案例 1 在编译时分配内存,而案例 2 在运行时分配内存。

    【讨论】:

      【解决方案3】:

      不同之处在于分配数据的位置。

      在案例 1 中,您的 Graph 结构的数据是在堆栈上分配的。您可以通过名称“g”访问它。

      在情况 2 中,您的 Graph 结构的数据是在堆上分配的。您可以通过指向该数据的指针访问它,该数据通过名称“g”保存。

      【讨论】:

        【解决方案4】:

        在情况 1 中,您在本地范围内的堆栈上创建图表。因此,当范围结束时,它将自动被删除。因此 g 是该 Graph 的实际实例化版本。

        在第二种情况下,您将 Graph 分配到堆上。然后 g 只是一个指针,在您明确删除之前不会被删除。

        【讨论】:

        • HEap 和 Stack 在这种情况下不是有用的概念。您要查找的术语是automatic storage durationdynamic storage duration。堆和堆栈的问题在于,当您拥有已动态分配的对象成员时,事情会变得混乱。动态分配的对象有dynamic storage duration,而它的成员(如果不是指针)是automatic storage duration(即使成员在堆上),并且在对象被销毁时会被正确清理。
        • 当然,它并没有多大实际用处,但是当你在工作面试中获得其中一项编程测试时,他们肯定会问你堆和堆栈之间的区别是什么,所以它是也知道!
        • 是的,这是一个很棒的 comp Sci 知识(你应该知道其中的区别)。但在解释 C++ 概念时,它并不完整。
        猜你喜欢
        • 1970-01-01
        • 2014-08-31
        • 2013-10-31
        • 2019-12-26
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 2021-09-07
        • 2011-06-16
        相关资源
        最近更新 更多