void PrintArray()
{
int a[4] = {4,3,1,5};
for(int i=0; i<4; i++)
cout<<a[i];
}
这个函数调用完成后,指针变量'a'所分配的内存和其指向的4个整数块会发生什么事情?它们会被释放掉还是会导致某种形式的内存泄漏?
void PrintArray()
{
int a[4] = {4,3,1,5};
for(int i=0; i<4; i++)
cout<<a[i];
}
这个函数调用完成后,指针变量'a'所分配的内存和其指向的4个整数块会发生什么事情?它们会被释放掉还是会导致某种形式的内存泄漏?
a
不是一个静态变量,它是一个自动变量。根据C99标准草案第6.2.4
节对象的存储期第4段所述:“如果一个标识符的对象没有链接且没有使用static存储类说明符,则具有自动存储期。”static
的生命周期为程序的生命周期,并在第5段中说明:a
的作用域是函数PrintArray
,与之相关联的存储在退出该作用域后被释放。3.7.3
节自动存储期第1段可以得到相关部分:自动变量不是静态的,它们在作用域结束时(即函数结束时)被处理。 静态变量将持续存在,它将保留其值,即使在函数中调用它也是如此。 这里有一个关于extern/static变量的链接,了解更多详情。
内存不会泄漏。它没有在堆上分配。现在,这里可能涉及到2个不同的内存位置。
{ 4,3,1,5 }
初始化程序存储的位置。通常这样的初始化程序存储在数据段中。在嵌入式系统中,这可能是只读闪存。在个人电脑或其他设备上,这将只是一个使用您的程序映像(例如EXE)进行初始化并且不会被修改的RAM区域。函数退出后,它仍然存在。但这不是泄漏 - 只是您程序的内存占用量的一部分(有些人可能称之为静态内存)。PrintArray()
函数作用域中为 a[]
分配的堆栈内存。编译器所做的是分配一些堆栈空间,并从数据段中复制函数开头的值。通常情况下,这就是发生的情况,以便如果您修改了 a[]
中的任何元素,它只会影响该特定函数调用的该数组。当再次调用 PrintArray()
时,原始初始化程序未被修改,可供重复使用。如果由于先前调用而导致值突变,则后续对 PrintArray()
的调用初始化为除 { 4,3,1,5 }
之外的某些内容将是奇怪/意外的。但是,在此处您没有修改它,因此可能不会在堆栈上分配任何内容。您的情况可能有所不同。假设 a[]
确实驻留在堆栈上,则在函数退出时将自动释放(因此是 auto
变量)。当然,发生的具体情况取决于您的编译器、链接器、设置(尤其是优化)和目标。
a
这样的自动对象会在声明它的代码块结束时被丢弃。
a
不是指针,而是一个数组。数组有时会衰变为指针。 - avakarnew
或者malloc
,那就需要担心内存泄漏。 - Neil Kirk