赞
踩
栈的作用:
局部变量和参数:当函数被调用时,函数的局部变量和参数会被分配到栈上。这是因为这些变量的生命周期通常只限于函数执行期间。
函数调用链:栈用于管理函数调用链,包括保存函数调用的返回地址、当前函数的状态和局部变量等。
自动内存管理:栈是一种LIFO(后进先出)的数据结构,函数调用结束后,栈上的内存会自动释放,无需显式管理。
运行时内存分配:
动态变化的内存需求:在程序运行时,某些数据的大小和数量可能无法提前确定。栈允许在函数调用时动态分配这些数据的内存。
栈帧(Stack Frame):每次函数调用都会在栈上创建一个新的栈帧,用于存储该函数的局部变量、参数和返回地址。函数返回时,该栈帧会被自动弹出,释放相应的内存。
示例:
void foo(int a) {
int b = a + 10; // b 是局部变量,分配在栈上
// ...
} // 函数结束,b 的内存被释放
int main() {
int x = 5;
foo(x); // 调用 foo 函数时,创建一个新的栈帧
// ...
return 0;
}
在这个示例中,foo 函数调用时,会在栈上分配内存用于存储局部变量 b 和参数 a。当 foo 函数返回时,这些内存会自动释放。
堆(Heap)允许跨函数的变量操作,这是因为在堆上分配的内存具有持久性,不依赖于函数调用的生命周期。堆上的内存可以在不同函数之间共享和传递,这使得它非常适合存储需要跨函数或线程共享的数据结构。
跨函数变量操作的原理:
动态内存分配:
通过动态内存分配函数(如malloc、calloc、realloc在C中,new在C++中)在堆上分配内存。
分配的内存返回一个指针,指向堆中的内存地址。
指针传递:
将指向堆内存的指针在函数之间传递,允许不同函数访问和操作相同的内存。
内存释放:
使用内存释放函数(如free在C中,delete在C++中)在合适的时机释放堆上的内存,避免内存泄漏。
定义:
特点:
malloc
和free
,C++中的new
和delete
,Java中的new
)进行分配和释放。使用场景:
内存分配:
效率:
生命周期:
典型问题:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。