1

如果我有以下代码:

对于 (...) { A a; }

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

4

7 回答 7

8

当你说:

for (...) { A a; }

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

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

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

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

然后当你说:

for (...) { A a; }

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

于 2010-02-19T13:36:12.120 回答
4

在堆栈上。

内存仅在执行时分配在堆上new(或者malloc,如果您正在做 C 风格的事情,则在堆上分配内存,而在 C++ 中您不应该这样做)。

于 2010-02-19T13:34:37.273 回答
2

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

于 2010-02-19T13:36:13.527 回答
0

那不是静态变量。A也分配在堆栈上。只有当显式ed 和ed
时,变量才会在堆上分配。newdelete

于 2010-02-19T13:36:43.557 回答
0

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

于 2010-02-19T13:37:03.680 回答
0

static 和 const 变量被放置在特殊区域的堆栈中。

于 2010-02-19T13:53:07.033 回答
0

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

for (...) { A a; }

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

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

但是如果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;

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

于 2010-02-19T14:23:16.677 回答