接下来就由我来为大家详细讲解一下C++的内存管理章节
这一章节我们重点要了解一下各行代码所在位置
首先理解一下C++程序内存区域分布:
局部变量在栈上面,动态开辟的在堆上面,静态在数据段,常量在代码段
接下来我们将对C语言与C++之间的不同做出对比
(1)malloc
(2)calloc//它与上一种的区别为其开辟空间会初始化所有数据为0
(3)realloc
既然C++兼容C语言,哪么是否可以利用上述代码??
答案是当然可以
C语言的内存管理虽然可以在C++中更使用,但是有些地方就无能为力,而且用起来十分麻烦,
因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存
首先new和delete不是函数,而是操作符
在C++中,开辟空间操作如下所示:
- int main()
- {
- int* p=new int;//开辟一个大小为一个整型的空间
- int* p1=new int[5];//开辟5个空间
- int* p2=new int(5);//开辟一个空间并赋值为5
- int* p3=new int[5]{1,2,3,4,5};//开辟五个空间并赋值
-
- delete p;
- delete[] p1;//单个对象删除如上所示,多个需要匹配类型,即在delete后面加上[]
- }
注:C++不支持扩容,故没有与realloc相对应的函数
new与malloc相比,后者开辟空间需要检查一下是否发生错误(检查是否开辟成功),前者会自动报错,而且前者会调用构造函数初始化并且会自动计算空间大小
new/delete是为自定义类型是准备的,对于内置类C语言与C++相关语言无区别
接下来哦我们一起再来了解一下新的概念:
operator new和operator delete函数:
operator new的作用是帮助new开空间,封装malloc,符合C++new的失败机制
最后我们了解一下定位new表达式
概念:定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
使用格式:new(place_address)type或者new(place_address)type(initializer-list),place_address
必须是一个指针,intializer-list是类型的初始化列表
new(p2)A(10);