C++动态开辟与C对比

首先,我们来回顾一下不同区的特点:

1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。
3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段--存储全局数据和静态数据。(静态区)
5. 代码段--可执行的代码/只读常量  (常量区)

 

一.C++内存管理方式

C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理
如下:

int main()
{
    int* p1 = new int;
    int* p2 = new int(10);
    int* p3 = new int[10];
    int* p4 = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int* p5 = new int[5] {1, 2, 3};
    delete p1;
    delete p2;
    delete[] p3;
    delete[] p4;
    delete[] p5;
    return 0;
}

()表示初始化

{}也是初始化,但是是对数组的,如果是部分初始化,未初始化部分为0

如果开辟未初始化,其结果未知

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用
new[]和delete[],注意:匹配起来使用

 

(原因大家可以自行去了解)

二.malloc/free和new/delete的区别:


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在释放空间前会调用析构函数完成
空间中资源的清理,在内置类型上区别不大。

 

三.内存泄漏

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内
存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对
该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现
内存泄漏会导致响应越来越慢,最终卡死

 

C/C++程序中一般我们关心两种方面的内存泄漏:
堆内存泄漏(Heap leak):
堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一
块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分
内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。
系统资源泄漏:
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放
掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定

 

最后,感谢大家的支持!!!

你可能感兴趣的:(数据结构)