目录
- C++和C的区别(申请堆区空间)
- C++中的new和delete
- 结束语
C++和C的区别(申请堆区空间)
在c语言中,在遇到需要申请一块堆区空间时,我们往往会使用malloc申请,使用free进行释放,但是为什么在c++中要使用新的方法?其实是有原因的。
我们先尝试在c++中使用malloc和free函数试试,看会不会有什么问题。
代码如下:
class Maker
{
public:Maker(){cout << "构造函数" << endl;}Maker(int a){cout << "有参构造函数" << endl;}~Maker(){cout << "析构函数" << endl;}
};void test01()
{Maker* m = (Maker*)malloc(sizeof(Maker));free(m);
}int main()
{test01();
}
接下来进行代码分析:
Maker* m = (Maker*)malloc(sizeof(Maker));
如上所示,由于声明的对象数据类型为Maker*,则在malloc之前也需要进行类型转换为Maker*,并且malloc中的参数为具体申请的空间大小,即数据类型Maker的大小,即sizeof(Maker)。
free(m);
同样在使用完一块堆区空间之后,我们需要使用free函数对申请的堆区空间进行释放。
代码运行结果如下:

如上所示,在使用malloc申请堆区空间和使用free释放堆区空间时,并不会调用本身的构造函数和析构函数,这其实就是在c++中不使用malloc和free的原因,那到底用什么方法呢?这就是接下来要讲解的内容。
C++中的new和delete
在c++中使用new的形式来申请堆区空间,使用delete的形式来释放堆区空间,具体使用案例如下:
class Maker
{
public:Maker(){cout << "构造函数" << endl;}Maker(int a){cout << "有参构造函数" << endl;}~Maker(){cout << "析构函数" << endl;}
};void test02()
{Maker* m = new Maker;delete m;m = NULL;Maker* m2 = new Maker(10);delete m2;m2 = NULL;
}int main()
{test02();
}
接下来进行代码分析:
Maker* m = new Maker;
如上所示,使用new的方式来申请堆区空间,也不需要像malloc那样还需要传入申请的具体内存大小,这些部分实际上c++已经替我们处理了,所以我们只需要new + 实际的类即可。
delete m;
在c++中使用delete来释放申请的堆区空间,由于之前我们已经实例化对象,并且实例化对象名为m,所以我们直接delete m即可。
m = NULL;
成功释放掉堆区空间之后,我们需要将实例化对象m置空,这也是为了保证代码的严谨和规范。
Maker* m2 = new Maker(10);
在之前的代码中,在申请堆区空间时,实际上调用的是类的构造函数,但是假如我们想要调用类的有参构造函数时,需要怎么调用呢?
如上代码所示,相较于无参构造函数,只需要在原来的基础上使用new Maker(10)的形式即可。
delete m2;
在c++中使用delete来释放申请的堆区空间,由于之前我们已经实例化对象,并且实例化对象名为m2,所以我们直接delete m2即可。
m2 = NULL;
成功释放掉堆区空间之后,我们需要将实例化对象m2置空,这也是为了保证代码的严谨和规范。
代码运行结果如下:

如上所示,使用new和delete时,成功的调用了类的构造函数和析构函数,同时也实现了调用类的有参构造函数。
结束语
如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!