目录
动态内存
-
C动态内存: malloc/calloc/realloc/free sbrk/brk mmap/munmap
-
C++动态内存:new/delete 底层调用的是C语言的函数
-
数据类型* 指针变量 = new 数据类型; //自动初始化为“零”
数据类型* 指针变量 = new 数据类型(初始值);
delete 指针变量;
#include <iostream> //26new.cpp using namespace std; int main(){ int *p = new int;//new一个int类型的内存空间 cout << *p << endl; *p = 1024; cout << p << endl; cout << *p << endl; delete p;//释放动态内存 double *pd = new double; cout << *pd << endl; *pd = 3.14159; cout << pd << endl; cout << *pd << endl; delete pd; p = new int(1024); cout << p << endl; cout << *p << endl; delete p; pd = new double(6.666); cout << pd << endl; cout << *pd << endl; return 0; }
- new[]/delete[] 用来对数组进行内存申请/释放
#include <iostream> //27newarr.cpp using namespace std; int main(){ int *p = new int[10]{111,222,1024};//申请10个int类型的内存地址 for(int i=0;i<10;i++){ cout << p[i] << " "; } cout << endl; for(int i=0;i<10;i++){ p[i] = i; } for(int i=0;i<10;i++){ cout << p[i] << " "; } cout << endl; delete[] p; return 0; }
★new/delete 和 malloc/free的区别?
-
new/delete是C++的操作符,new可以重载
malloc和free是C语言标准库中的函数 -
new在申请动态内存时,不需要自己计算内存大小,是按照数据类型进行分配
malloc在申请动态内存时,需要指定内存大小,是按照指定的大小进行分配 -
new会调用类的构造函数,且申请的动态内存不会有垃圾值
malloc不会调用类的构造函数
-
delete在释放动态内存时,会调用类的析构函数
free不会调用类的析构函数 -
malloc出错时,会返回NULL并且设置errno
new出错时,则抛出bad_malloc的异常
-
malloc返回值类型为void*,所以malloc的返回值通常都需要进行类型转化
new返回值类型为 new的数据类型的指针
-
new申请数组内存时需要用new[]一次分配所有内存,多次调用构造函数,搭配使用delete[], delete[]多次调用析构函数,销毁数组中的每个对象
malloc可以直接申请数组内存,只能sizeof(int) * n。
-
malloc分配的内存不够时,可以用realloc扩容
new不需要这样的操作