目录
- 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
时,成功的调用了类的构造函数和析构函数,同时也实现了调用类的有参构造函数。
结束语
如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!