我试图了解C ++的工作原理。当你在循环中声明一个新变量(int x)时,例如在for循环中。内存被分配给循环中的变量x,但退出for循环后该内存会发生什么?我对朋友的理解是Java会自动解除内存的分配,但是C ++呢?
感谢。
答案 0 :(得分:4)
如果在堆栈上声明(即通过int x = ...
)并且变量离开其范围,它将被释放。如果在堆上声明(即通过int *x = new int(...)
),它将无法解除分配。在这种情况下,您必须明确使用delete
运算符。
答案 1 :(得分:1)
在C ++中,局部变量在超出范围时会自动销毁。如果您在for
循环内声明了变量,那么当循环退出或前进到下一次迭代时它将被销毁。
请注意,这不适用于在堆上分配的对象(例如,使用new
或std::malloc()
);他们需要被明确销毁。
答案 2 :(得分:1)
以下是c ++中的3种可能情况:
静态内存,其中对象在程序的持续时间内由链接器分配。函数中的全局变量和名称空间变量,静态类成员和静态变量在静态内存中分配。在静态内存中分配的对象构造一次并持续到程序的末尾。例如:
void f() {
for (;;) {
static int i = 0; //memory will not be deallocated until the program ends.
}
}
自动存储器,其中分配了函数参数和局部变量。每个条目 进入函数或块获取自己的副本。当它超出范围时,会自动创建和销毁这种内存;因此名称自动记忆。自动内存也被称为“在堆栈中”。例如:
void f() {
for (;;) {
int i = 0; //memory will be deallocated when get out of the loop's scope.
}
}
免费存储,程序明确请求对象的内存以及a
程序完成后可以再次释放内存(使用new
和delete
)。免费存储也称为动态内存或堆。
例如:
void f() {
for (;;) {
int * pi = new int; //memory newed will not be deallocated until delete called.
//memory of the pointer self will be deallocated when get out of the loop's scope, same as case 2.
}
}