1.概念的介绍
总括:
1. 栈(Stack)
-
存储内容:
-
局部变量(包括函数参数、非静态局部变量)。
-
函数调用的上下文信息(如返回地址、寄存器状态等)。
-
特点:
-
内存由编译器自动分配和释放。
-
生命周期与函数调用相关,函数结束时自动释放。
-
大小有限,通常较小(几MB)。
-
访问速度快。
-
-
2.堆区
-
存储内容:
-
动态分配的内存(通过
new
、malloc
等分配的内存)。 -
需要手动管理内存的分配和释放。
-
-
特点:
-
内存由程序员手动管理(使用
new
/delete
或malloc
/free
)。 -
生命周期由程序员控制,直到显式释放。
-
大小较大,受系统内存限制。
-
访问速度较慢。
-
void bar() {
int* ptr = new int(20); // ptr 指向堆区分配的内存
delete ptr; // 手动释放堆区内存
} -
3. 静态区(Static/Global Area)
-
存储内容:
-
全局变量。
-
静态变量(包括静态局部变量和静态成员变量)。
-
特点:
-
内存分配在程序启动时完成,程序结束时释放。
-
生命周期贯穿整个程序运行期间。
-
访问速度较快。
-
int globalVar = 30; // 全局变量,存储在静态区
void baz() {
static int staticVar = 40; // 静态局部变量,存储在静态区
} -
4. 常量区(Constant Area)
-
存储内容:
-
常量数据(如字符串常量、
const
修饰的常量变量)。 -
只读数据。
-
-
特点:
-
内存分配在程序启动时完成,程序结束时释放。
-
数据不可修改。
-
访问速度较快。
-
const int constVar = 50; // 常量变量,存储在常量区
const char* str = "Hello, World!"; // 字符串常量,存储在常量区-
2.new和delete
1.new
1.int *ptr1=new int;创建一个Int类型的变量
2.int*ptr2=new int[10];创建10个int类型的变量。
3.int*pt3r=new int[10]{1,2,3,4};这里意思是创建10个int类型的空间,然后将前四个分别初始化为1,2,3,4,然后后面的都初始化为0。
4.当int变为自定义类类型的时候,会自动调用构造函数。
2.delete
1.上面三个地址删除时调用delete,写法分别是,delete ptr1,
delete []ptr2,delete[]ptr3;
申请连续空间用new[],删除连续的空间delete[]。
3.new和delete操作自定义类型
当new和delete对自定义类型进行操作时,会自动调用构造函数和析构函数。
4.operator new和operator delete
new和delete在底层会调用operator new和operator delete进行动态内存空间管理。operator new operator delete它们两个是系统提供的全局函数,new调用opreator new,delete调用operator delete来释放和申请空间。
5.new和delete的实现原理
6.定位new
定位new是在已分配空间的部分调用构造函数初始化对象 ,一般配合内存池使用,因为一般内存池中的类对象是没有初始化的。
7.malloc和new的区别
1.malloc是函数,new是操作符。
2.malloc不会初始化,new会初始化。
3.malloc申请空间需要手动计算空间的大小,new可以不同后面直接跟类型(有内置类型int,char等,也有自定义类型date等),如果是多个对象直接在[]里面跟上创建对象的个数即可。
4.malloc创建的空间返回的指针是void*,必须强制转换,new可以不用,因为new在使用的时候后面跟了类型。
5.malloc开辟空间失败时返回NULL,但是new不会,它会抛出异常。需要来接收。
6.申请自定义类型对象时,new会调用构造函数,delete在释放空间前会调用析构函数释放自定义对象的资源,但是malloc和free不会。
-
-
-
-
-
-
-