如果我有以下代码:
for(...) { 一个; }
会在堆上还是在堆栈上分配?
答案 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;
相同的程序员用来称“静态变量”和“变量声明为静态”。