C++内存模型
在 C++ 中,程序运行时,内存主要分成四个区,分别是栈、堆、数据段和代码段。 
- 栈:存储局部变量、函数参数和返回值。
- 堆:存储动态开辟内存的变量。
- 数据段:存储全局变量和静态变量。
- 代码段:存储可执行程序的代码和常量(例如字符常量),此存储区不可修改。
栈和堆的主要区别:
1)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需手动释放,若程序中不释放,程序结束时由操作系统回收。
2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数)。
3)分配方式不同:堆是动态分配;栈有静态分配和动态分配(都是自动释放)。
4)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。
5)是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。
6)增长方向不同:栈向下增长,以降序分配内存地址;堆向上增长,以升序分配内存地址。
动态分配内存new和delete
使用堆区的内存有四个步骤:
1)声明一个指针;
2)用new运算符向系统申请一块内存,让指针指向这块内存;
3)通过对指针解引用的方法,像使用变量一样使用这块内存;
4)如果这块内存不用了,用delete运算符释放它。
申请内存的语法:new 数据类型(初始值); // C++11支持{}
如果申请成功,返回一个地址;如果申请失败,返回一个空地址(暂时不考虑失败的情况)。
释放内存的语法:delete 地址;
释放内存不会失败(还钱不会失败)。
注意:
- #include
// 包含头文件。 - using namespace std; // 指定缺省的命名空间。
-
- int main()
- {
- // 1)声明一个指针;
- // 2)用new运算符向系统申请一块内存,让指针指向这块内存;
- // 3)通过对指针解引用的方法,像使用变量一样使用这块内存;
- // 4)如果这块内存不用了,用delete运算符释放它。
- // 申请内存的语法:new 数据类型(初始值); // C++11支持{}
- // 释放内存的语法:delete 地址;
- int* p = new int(5);
- cout << "*p=" << *p << endl;
- *p = 8;
- cout << "*p=" << *p << endl;
- delete p;
-
- /* for (int i = 1; i > 0; i++)
- {
- int* p = new int[100000]; // 一次申请100000个整数
- cout << "i="<
- }/*
- }