当对象在函数内部静态构造时,它是在堆上还是在堆栈上分配?

时间:2010-02-19 13:33:08

标签: c++ memory-management stack heap

如果我有以下代码:

for(...) {     一个; }

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

7 个答案:

答案 0 :(得分:8)

当你说:

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指向的存储是动态创建的。

答案 1 :(得分:4)

在堆栈上。

只有在执行new(或malloc及其朋友时,如果你正在做C风格的事情,你不应该在C ++中分配内存)。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

那不是静态变量。 A也在堆栈上分配 仅在明确new ed delete ed。

时才在堆上分配变量

答案 4 :(得分:0)

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

答案 5 :(得分:0)

静态和常量变量放在特殊区域的堆栈中。

答案 6 :(得分:0)

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

for (...) { A a; }

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

  

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

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

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);
}

如果不调用免费程序,则不会自动释放p变量。

再见(对不起我的英语)

PS:我想说“静态”这个词在这种背景下如此严厉批评,它并不像jkp和jldupont那么糟糕......

  

jkp:“”静态“这个词在那里有点误导,它意味着使用静态关键字....

     

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

依旧......

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

当您定义静态变量时,换句话说

static A a;

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