【问题标题】:Heap-Dynamic or Stack-Dynamic?堆动态还是堆栈动态?
【发布时间】:2012-12-20 13:11:46
【问题描述】:

请解释一下这段代码中“x”是堆栈动态变量还是堆动态变量?如果是堆动态变量,为什么它不是堆栈动态变量?谢谢

function foo(){ MyClass x = new MyClass();}

【问题讨论】:

  • 如果这是家庭作业:你认为答案是什么,为什么?
  • 不,这不是家庭作业。我想不出更好的例子来表达我的困惑。

标签: heap-memory programming-languages callstack


【解决方案1】:

堆栈动态变量在您调用函数时出现。它们存在于 C++ 运行时堆栈中,并且是临时的。它们要么在参数列表中,要么在函数内部声明(静态变量除外,它们不在堆栈上实例化)。这些变量在超出范围时会消失,并且运行时会回收其内容的内存。

堆动态实例存在于运行时预留的另一个称为“堆”的内存区域中。这些实例通过。 "new" 运算符,并且必须由 "delete" 运算符显式释放。

希望对你有帮助

【讨论】:

    【解决方案2】:

    我不确定这是什么语言,我会说它只是伪代码,但大多数常见的 OO 语言中的概念应该是相同的。

    让我们分解一下:

    function foo() {
        MyClass x = null;
        x = new MyClass();
    }
    

    第一行MyClass x = null 将在本地堆栈上分配一些空间。空间并不大,刚好可以存放一个引用。

    第二行x = new MyClass()会做一些事情:

    1. 在堆上为 MyClass 的新实例分配空间
    2. MyClass 调用正确的构造函数
    3. 更改x 引用以指向这个新实例。

    所以简单的答案是:两者兼而有之。

    【讨论】:

    • 请注意,像MyClass x 这样的声明不一定只是每种语言的引用。
    • 那么编译器如何决定一个变量应该分配在堆栈还是堆上?。这里的触发器是“new”关键字吗?还是有更一般的规则?这是因为如果相反“MyClass x”如果它是“int x”,那么这将是一个堆栈动态变量。对吧?
    • 准确地说。堆分配几乎总是使用newmalloc 或类似的东西显式地分配。
    • 那么如果“MyClass”包含像“int y”这样的基元实例变量怎么办。这些也是堆动态的吗,因为“MyClass”是?
    • 这是一个很好的问题,你说得对。在这种情况下,它将在堆上分配。
    【解决方案3】:

    这个特定的一个是:动态堆(我假设你在这里用 JAVA 编程)。至于为什么不在栈上?

    • 这会分配内存
    • 它不是自动变量

    有关一般说明,请参阅本文: http://www.maxi-pedia.com/what+is+heap+and+stack

    【讨论】:

    • 为什么要将 malloc 的内存分配给一个普通的旧字符?还有calcSize是什么?
    • 好的。这个变量的空间是在运行时分配还是在编译时分配?
    • 运行时,只有原始类型和字符串(带final)是编译时。私有最终 int 数 = 10;例如可以是编译时间
    • 所以是关键字决定将变量声明为 Stack-Dynamic 还是 Heap-Dynamic?例如。由于“int”,“int x=2”是 Stack-Dynamic,而 MyClass x=new MyClass() 因为“new”而成为 Heap-Dynamic。
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2019-05-17
    • 2023-01-11
    • 2011-02-04
    • 2014-08-15
    • 2019-07-01
    • 2023-03-16
    相关资源
    最近更新 更多