【问题标题】:When object is constructed statically inside a function, would it be allocated on the heap or on the stack?当对象在函数内部静态构造时,它是在堆上分配还是在堆栈上分配?
【发布时间】:2010-02-19 13:33:08
【问题描述】:

如果我有以下代码:

对于 (...) { 一个; }

a 会分配在堆上还是堆栈上?

【问题讨论】:

  • “statically”这个词在这里有点误导,它暗示使用 static 关键字,它不会在堆栈上创建变量。
  • 我的意思是静态而不是动态构造(使用新的)

标签: c++ memory-management heap-memory stack-memory


【解决方案1】:

当你说:

for (...) { A a; }

变量 a 不是静态构造的。那将是:

for (...) { static A a; }

实际上,在您的代码中,a 是一个自动对象,在堆栈​​上创建。然而,这并不意味着没有动态分配发生。如果 A 看起来像这样:

struct A {
   A() { p = new char[100]; }
   char *p;
};

那么当你说:

for (...) { A a; }

a.p 的存储是在堆栈上创建的,但 a.p 指向的存储是动态创建的。

【讨论】:

    【解决方案2】:

    在堆栈上。

    内存仅在执行new(或malloc 及其朋友,如果您正在使用C 风格,而在C++ 中不应该这样做)时分配在堆上。

    【讨论】:

    • 总是这样吗?如果 A 对象有一个巨大的私有成员(双数组 [1000000];)怎么办?这还会在堆栈中分配吗?
    • 对象本身仍然会在栈上分配,即使它的一些成员可能是堆分配对象的指针
    【解决方案3】:

    您没有在代码中声明 static 变量 - 它是一个局部范围的变量,因此最终会出现在堆栈中。

    【讨论】:

      【解决方案4】:

      这不是静态变量。 A也在堆栈上分配。
      只有当明确的newed 和deleteed 时,变量才会在堆上分配。

      【讨论】:

        【解决方案5】:

        A 将完全分配在堆栈上。当然,A 可以在其构建期间从堆中分配内存。

        【讨论】:

          【解决方案6】:

          Static 和 const 变量放在堆栈的特殊区域。

          【讨论】:

            【解决方案7】:

            变量是在堆栈上创建的。在您的代码中:

            for (...) { A a; }
            

            ...然后在任何“for”循环结束时,变量会自动销毁(因为它超出了范围),正如尼尔所说:

            Neil Butterworth:事实上在你的代码中,a 是一个自动对象...

            但是如果一个对象在他自己的生命周期中进行了一些动态分配(IOW,在堆上),那么请注意自己释放内存,或者在A的析构函数中,或者在外部。 C 示例:

            struct A {
              A(char *ptr);
              ~A();
            
            private:
              char *p;
              int len;
            };
            
            A::A(char *ptr)
            {
              len = strlen(ptr);
              p = (char *) malloc(len+1);
              if(!p) {
                exit(1);
              }
              strcpy(p, ptr);
            }
            
            A::~A()
            {
              free(p);
            }
            

            如果不调用 free 过程,p 变量不会自动释放。

            再见(对不起我的英语)

            PS:我想说“静态”这个词在这种情况下受到如此严厉的批评,它并没有像 jkp 和 jldupont 那样糟糕......

            jkp : ""statically" 这个词在那儿有点误导,它暗示了 static 关键字的使用......"

            jldupont : "你没有声明一个静态变量...."

            等等……

            jkp 和 jldupont 100% 正确,但在意大利技术语言中,一些 C++ 程序员使用“静态创建”和“静态构建”这两个词" 来标识一个变量会在栈上创建

            当你定义一个静态变量时,换句话说

            static A a;
            

            同样的程序员用来调用“静态变量”和“声明为静态的变量”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-09-16
              • 2019-10-25
              • 1970-01-01
              • 1970-01-01
              • 2013-05-13
              • 2017-02-21
              • 2010-09-17
              相关资源
              最近更新 更多