【QIUC】第一卷-C/C++高级(九)- C++的内存分配
栈区(Stack)
栈区(Stack):函数的参数和局部变量存在栈区。函数调用时生成,函数执行完自动释放,只是临时的。
-
栈帧:当调用一个函数时,就会在栈空间为这个函数,分配一块内存区域,专门给这个函数用。这块内存区域,就叫做“栈帧”。
-
若内存超出栈帧,就会导致内存溢出
//运行时将因为栈帧空间溢出,而崩溃 void test(void) { //2M在栈空间里 char buff[2000000]; cout <<(int)buff[sizeof(buff)-1]; //访问数组最后一个成员,在此处崩溃 } //这是由于递归函数的多次调用导致的内存溢出 void test(int n) { char buff[1024 * 100]; //100K printf("n=%d\n", n); printf("%X", buff); if (n == 1) return; else test2(n - 1); int main(void) { test2(20); return 0; } /* n=3 1F6D1C //两个地址之间相差100kb,即第三次 n = 2 1DD6F8 //两个地址之间相差100kb,即第二次 n = 1 1C40D4 */
堆区(Heap)
堆区(Heap):由程序员自己分配,也是动态内存分配区。但是若不进行内存释放,可能会导致内存泄漏。而未释放的内存会持续至main函数结束后操作系统将其进行释放。
全局/静态区
全局/静态区:全局变量和静态变量存储区,但是静态变量在哪定义就在哪调用,且静态变量会储存值。
文字常量区
文字常量区:常量字符串,即字符串常量相同时存放地址相同。
程序代码区
程序代码区:存放函数体的二进制指令