博客ID:LanFuRen
C系列专栏:C语言重点部分 C语言注意点 C++基础 Linux 数据结构 C++注意点
声明等级:黑色->蓝色->红色欢迎新粉加入,会一直努力提供更优质的编程博客,希望大家三连支持一下啦
目录
1)C++中新的内存管理方法
如何使用new 与delete
代码:
#include<iostream>
using namespace std;
class A
{
public:
A(int a=0)//给缺省值
:_a(a)
{
cout << "A()"<<endl;
}
~A()
{
cout << "~A()"<<endl;
}
void Print()
{
cout << _a <<endl;
}
private:
int _a;
};
int main()
{
A aa(1);
aa.Print();
A* p2 = new A;
A* p1 = new A[10];
delete p2;
delete[] p1;
return 0;
}
从以上代码不难看出new和delete的用法,那我就简单的解释一下两者的用法:
1.new的用法
new可以动态申请一个内置(或自定义)类型的空间
int*cptr1=new int;
A*cpptr1=new A;
new还可以动态申请一个内置(或自定义)类型的空间
int*cptr2=new int(10);
A*cpptr2=new A(1);//这里存在隐式类型转换
new还可以动态申请n个内置类型的空间(n是整数)
int*cptr3=new int[10];
A*cpptr3=new A[10];//开辟10个A类对象
2.delete的用法
delete会释放空间里的内存(值),然后调用析构函数(使指针迁移——ptr=nullptr)。
而且我们在使用delete的时候,要注意跟new进行匹配。
delete cpptr1;
delete cpptr2;
delete [] cpptr3;
2)为何不用C语言中的动态内存管理的函数
根据1)的分析,我们可以直观的感受到cpp新的内存管理方法更简便,所以不再去使用c语言的内存管理函数。
简便在于:cpp的吗内存函数会自动调用构造函数和析构函数,但是c语言函数调用不了,如果是内置类型的内存开辟,两者没有啥区别;但是自定义类型的内存开辟就得需要调用构造和析构了,但是cpp中是无法显示调用构造函数,所以这里用c的malloc等函数就失败了,但是可以调用析构函数,但是只能调用析构函数,构造函数的无法调用导致c的内存开辟是无法很好地使用的。