知识总结(new与malloc的区别、线程与进程的区别)

一、new与malloc的区别

new delete是运算符,malloc()  free()是函数

malloc和free是c/c++标准库函数,new和delete是c++运算符。它们都可以用于申请动态内存和释放内存。

函数内声明的变量在栈区,代码段运行结束,栈区内存会自动释放

malloc和new申请的内存在堆区,使用完毕需要程序员手动释放

它们的区别如下:

1.属性

new/delete是C++运算符,需要编译器支持。malloc/free是库函数,需要头文件支持。

2.参数

使用new 运算符申请动态内存时无需指定内存块的大小,编译器会根据类型信息计算出大小,而使用malloc时就需要传入申请的大小数值。

3.返回类型

new操作符申请内存成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,因此new是符合类型安全性的操作符。malloc申请内存成功时的返回类型为void*,需要通过强制类型转换将void *转换成所需要的类型。

4.申请失败

new操作符申请内存失败时,会抛出异常。malloc申请内存失败时,返回为NULL,因此每一次当使用malloc函数之后都要进行判空操作,处理比较麻烦。

5.相互调用

c++兼容c的版本,因此new可以调用malloc(调用operator new函数开辟内存时,底层通常由malloc实现),而malloc不能调用new操作符。

6.能够直接重新分配内存

使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存的再扩充。realloc 先判断当前指针所指的内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并返回原来的地址指针;如果空间不够,先按照新的大小分配空间,将原有数据从头到尾拷贝到新开辟的内存区域中,释放掉原来开辟的内存区域。

new中没有这一机制,因为new在申请内存块大小时不用进行计算,编译器会自动进行计算。

7.调用构造/析构函数

用new分配对象内存时会经历三个步骤:

(1)调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间 ;

(2)调用构造函数对对象进行构造,并传入初值;

(3)构造完成后,返回一个指向该对象的指针

用delete来释放对象内存时两个步骤:

(1)调用析构函数对对象内存进行释放;

(2)调用operator delete(或operator delete[])函数释放内存空间;

malloc和free不会调用构造/析构函数。


二、进程与线程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

1.同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程中至少包含一个线程。
2.进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会     影响同个进程中的其他线程的结束.。
3.线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
4.线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值