C++内存四区指的是程序在运行时所使用的内存分为代码区、全局区、栈区和堆区。下面我们分别来讲解一下这四个区域。
1. 代码区
代码区是存储函数体等二进制代码的区域,它需要保护,以免被其他程序或者用户修改。代码区一般位于内存的高地址部分,从而防止由于栈溢出操作而覆盖代码区。
代码示例:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
以上代码将打印出 “Hello, World!"。这个程序在执行时,代码区存储着编译器生成的二进制代码。
2. 全局区
在程序执行过程中,全局变量和静态变量存储在全局区。在程序的整个生命周期内,这些变量都存在于全局区。
代码示例:
#include <iostream>
int gloVar = 10; //全局变量
int main() {
static int staVar = 5; //静态变量
std::cout << "gloVar: " << gloVar << std::endl;
std::cout << "staVar: " << staVar << std::endl;
gloVar++;
staVar++;
std::cout << "gloVar: " << gloVar << std::endl;
std::cout << "staVar: " << staVar << std::endl;
return 0;
}
以上代码定义了一个全局变量 gloVar
和一个静态变量 staVar
。在 main
函数中,我们打印出它们的初始值,对它们进行了自增操作,并再次打印。
这个程序在执行时,全局变量和静态变量会存储在全局区。
3. 栈区
在函数被调用的时候,函数的参数、返回地址等信息都会存储在栈区。栈区的大小默认是由编译器决定的。在函数执行完毕后,这里存储的数据会自动被清除。
代码示例:
#include <iostream>
int sum(int a, int b) {
int result = a + b; //局部变量,存储在栈区
return result;
}
int main() {
int x = 10, y = 20; //局部变量,存储在栈区
int result = sum(x, y);
std::cout << "result: " << result << std::endl;
return 0;
}
以上代码中,函数 sum
被调用了,x
和 y
存储在栈区中作为参数传递给 sum
函数。 result
是 sum
函数中的局部变量,也存储在栈区中。
4. 堆区
在程序运行过程中,动态分配的内存空间(由new操作符申请)即存储在堆区,由程序员进行手动管理和回收。如果不释放堆区的内存,就会造成内存泄漏。
代码示例:
#include <iostream>
int main() {
int *ptr = new int; //在堆区分配内存
*ptr = 10;
std::cout << "*ptr: " << *ptr << std::endl;
delete ptr; //释放内存
return 0;
}
以上代码中,通过 new
操作符分配了一个 int
类型的内存空间存储到堆区,并将其赋值为 10
。在使用完这个内存空间后,我们需要使用 delete
操作符将其释放。
这就是C++内存四区的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++内存四区之代码区、全局区、栈区和堆区 - Python技术站