C/C++动态内存管理

1.C/C++内存分布

(1). 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。

(2). 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内

​ 存,做进程间通信。

(3). 堆用于程序运行时动态内存分配,堆是可以上增长的。

(4). 数据段--存储全局数据和静态数据。 ·

(5). 代码段--可执行的代码/只读常量。

2.C++动态内存管理方式

单个类型的空间:new delete

连续空间的空间:new[] delete[]

1.new/delete操作内置类型

new/delete不是函数,而是运算符,也是C++中的关键字

int* p1=new int;//申请int类型大小的一个空间
int* p2=new int(100)//申请int类型大小的一个空间并初始化为100
    
int* p3=new int[10];//申请10个连续的int类型大小的空间
int* p4=new int[10]{0,1,2,3,4,5,6,7,8,9}//申请10个连续的int类型大小的空间并初始化

2.new/delete操作自定义类型

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

Test* p1=new Test;
Test* p2=new test[10];

3.定位new表达式(placement-new)

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

class Test
{...};
void Test()
{
    // pt现在指向的只不过是与Test对象相同大小的一段空间,还不能算是一个对象,因为构造函数没有执
    Test* pt = (Test*)malloc(sizeof(Test));
    //定位new表达式
	new(pt) Test; // 注意:如果Test类的构造函数有参数时,此处需要传参
}

3.malloc/free和new/delete的区别

共同点:都是从堆上申请空间,并且需要手动释放

不同点:

1.malloc和free是函数,new和delete是操作符

2.malloc申请的空间不能初始化,new可以初始化

3.malloc申请空间需要手动计算空间大小并传递,new只需在后面跟上空间类型

4.malloc的返回值是void*,使用时必须强转,new不需要,因为new后跟的是空间类型

5.malloc申请空间失败会返回NULL,因此使用时必须判空,而new不需要,但new需要捕获异常

6.malloc和free只会操作空间,而new和delete会调用构造和析构函数