如果我有以下代码:
对于 (...) { A a; }
a 会分配在堆上还是堆栈上?
当你说:
for (...) { A a; }
变量 a 不是静态构造的。那将是:
for (...) { static A a; }
实际上,在您的代码中, a 是在堆栈上创建的自动对象。然而,这并不意味着没有动态分配发生。如果 A 看起来像这样:
struct A {
A() { p = new char[100]; }
char *p;
};
然后当你说:
for (...) { A a; }
ap 的存储是在堆栈上创建的,但 ap 指向的存储是动态创建的。
在堆栈上。
内存仅在执行时分配在堆上new
(或者malloc
,如果您正在做 C 风格的事情,则在堆上分配内存,而在 C++ 中您不应该这样做)。
您没有static
在代码中声明变量 - 它是一个局部范围的变量,因此它将最终出现在堆栈中。
那不是静态变量。A也分配在堆栈上。只有当显式ed 和ed
时,变量才会在堆上分配。new
delete
A 将完全分配在堆栈上。当然,A 可以在其构建期间从堆中分配内存。
static 和 const 变量被放置在特殊区域的堆栈中。
该变量是在堆栈上创建的。在您的代码中:
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;
相同的程序员用来调用“静态变量”和“声明为静态的变量”。