以下内容转载自
https://blog.youkuaiyun.com/xxpresent/article/details/53024555
说起new和delete,了解过c++的人应该都知道吧,它是用来分配内存和释放内存的两个操作符。与c语言中的malloc和free类似。
c语言中使用malloc/calloc/realloc/free进行动态内存分配,malloc/calloc/realloc用来在堆上分配空间,free将申请的空间释放掉。
malloc:
- void FunTest()
- {
- int *pTest = (int*)malloc(10*sizeof(int)); //开辟10个int型的空间大小
- if(pTest != NULL)
- {
- free(pTest);
- pTest = NULL;
- }
- }
- void FunTest()
- {
- int *pTest = (int*)calloc(10,sizeof(int)); //分配10个int型的内存块,并将其初始化为0
- if(pTest != NULL)
- {
- free(pTest);
- pTest = NULL;
- }
- }
- void FunTest()
- {
- int *pTest = (int*)malloc(10*sizeof(int));
- realloc(pTest,20*sizeof(int)); //改变原有空间大小,若不能改变则会新开辟一段空间,并将原有空间的内容 拷贝过去,但不会对新开辟的空间进行初始化
- free(pTest);
- }
对于内存泄漏,我介绍一下我所见过的内存泄漏吧:
(1)申请内存但并未释放。
- void FunTest()
- {
- int *pTest1 = (int*)malloc(10*sizeof(int));
- *pTest1 = 0;
- }
①同一块空间释放两次,导致崩溃;
②有一块空间没有释放,以为释放了,导致内存泄漏。
- void FunTest()
- {
- int *pTest1 = (int*)malloc(10*sizeof(int));
- int *pTest2 = (int*)malloc(10*sizeof(int));
- pTest1 = pTest2;
- free(pTest1);
- free(pTest2);
- }
- void FunTest()
- {
- char *pTest1 = (char*)malloc(5);
- strcpy(pTest1,"hello world");
- free(pTest1);
- }
- void FunTest()
- {
- int *pTest1 = (int*)malloc(10*sizeof(int));
- assert(pTest1 != NULL);
- pTest1[0] = 0;
- pTest1++; //地址向后移动了一位
- free(pTest1);
- }
c++中是通过new和delete操作符进行动态内存管理的。
先用一张图简单的说明一下new和delete的含义:
记住:new和delete就像malloc和free一样,都要成对使用哦。
我们再看一个这样的表达式:
- string *s = new string("a value"); //分配并初始化一个string对象
- string *str = new string[10]; //分配10个默认初始化的string对象
这是string *s = new string("a value"); 这句表达式内部的实现:
我们可以看出new内部的调用顺序:(初始化一个对象时)
new内部的调用顺序:(初始化若干个对象时)
同样地,delete对象时,调用顺序为:(delete单个对象时)
delete对象时,调用顺序为:(delete多个对象时)
接下来,看一下动态内存分布图:
new和delete与malloc和free一样,都是存在堆上的。那么,二者有什么差别呢?
· 总结new/delete和malloc/free的区别和联系:
1. 它们都是动态管理内存的入口。
2. malloc/free是C/C++标准库的函数,new/delete是C++操作符。
3. malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造
析构函数进行初始化与清理(清理成员)。
4. malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型的大小
对应类型的指针。
5.new/delete的底层调用了malloc/free。
6.malloc/free申请空间后得判空,new/delete则不需要。
7.new直接跟类型,malloc跟字节数个数。