一、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.线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源 。