c语言内存函数
1malloc
2calloc 初始化为0
3realloc
4free
int* p1=(int*)malloc(sizeof(int));
int* p2=(int*)calloc(n,sizeof(int));
int* p3=(int*)realloc(ptr,sizeof(int));
c++内存管理
int* p1 = new int;
int* p2 = new int[];
int* p3 = new int(10);//初始化为0
int *p4=new int[10]{1,2,3,4};//初始化1,2,3,4其他为0
delete p1;
delete []p2;
new和malloc区别
1new不是函数 是操作符重载 用法简洁
2new对内置类型基本一样 但可以初始化
3对于自定义类型 会开空间加调用构造函数和析构函数
new会调用构造函数,delete会调用析构函数
4new失败后会抛异常,不用手动检查
operator new和operator delete函数
A*p1=(A*)malloc(sizeof(A));
A*p1=(A*)operator new(sizeof(A));
特性
1operator new 实际用malloc申请空间,申请失败后尝试执行空间不足应对措施
如果应对措施用户设置了,继续申请,否则抛异常
2operator delete 最终是通过free释放空间
new delete实现原理
对于内置类型
区别 new申请空间失败会抛异常,malloc会返回NULL
对于自定义类型,
new
1调用operator new函数申请空间(先
2在申请的空间执行构造函数(后
delete
1在空间上进行析构函数(先
2通过operator delete释放空间(后
以下了解即可:正常使用还是要匹配使用
int main()
{
char* p = new char[100];
delete []p;//内置类型
delete p;没区别
}ClassA *pclassa=new ClassA[5];//取决于编译器:在 开辟的内存前四个字节储存对象个数
delete pclassa;//从四个字节后析构delete []pclassa;//从从四个字节前析构
new/malloc和delete/free
共同点
都是在堆上申请空间,都需要用户手动释放内存
不同点
1new是操作符 malloc是函数
2malloc 申请的空间不会初始化,new可以初始化
3malloc申请空间失败返回NULL,new申请失败抛异常
4对自定义类型
new开空间加调用构造函数,delete调用析构函数后释放空间
内存泄漏
由于错误或疏忽 导致程序未能释放不再使用的内存
失去了对内存的控制 造成内存的浪费
危害:长期内存泄漏,会是系统的响应越来越慢