一、对象的动态建立和释放
1.1.1 前言
- 在C语言中利用库函数 malloc 和 free 来分配和撇销内存空间。
- C++ 提供较简使而功能较强的运算符new和delete类取代malloc和free函数。特别注意:new和delete是运算符,并不是函数,因此执行效率高!
- 为了兼容C语言,c++仍然保留 malloc 和 free 函数,但是建议不要使用,而是使用 new和delete。
1.1.2 基本语法
new int;//开辟一个存放整数的存储空间.返回一个指向该存储空间的地址(及指针)
new int(10);//开辟一个存放整数的空间,并指定该整数的初始值为100.返回一个指向该存储空间的地址
new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素地址
new int[5][4];//开辟一个存放二维数组(大小为5*4)的空间,返回首元素地址
float *p=new float(3.14159);//开辟一个存放单精度数的空间,并制定该数的初始值为3.14159,将返回的地址复制给指针变量p
二、例子分析
2.1.1 例一
下面代码分别展示了C语言与c++在分配基础类型、分配数组、分配对象的做法。
#include <iostream>
using namespace std;
class Test
{
public:
Test(int _a) {
a = _a;
cout << "构造函数" << endl;
}
~Test() {
cout << "析构函数" << endl;
}
private:
int a;
};
// new和delete的基本语法与malloc和free进行对比
void objplay1()
{
//分配基础类型
//c语言
int *p = (int *)malloc(sizeof(int));
*p = 10;
//c++
int *p2 = new int;
*p = 20;
int *p3 = new int(30);
//分配数组
//c语言分配数组
int *pArray_1 = (int*)malloc(sizeof(int) * 10);
pArray_1[0] = 1;
free(pArray_1);
//C++分配数组
int *pArray_2 = new int[10];
pArray_2[1] = 2;
delete[] pArray_2; //数组是要[]
//分配对象
//new能自动的执行类型构造函数,delete能执行类的析构函数
//C语言
Test *pT1 = (Test *)malloc(sizeof(Test));
free(pT1);
//C++
Test *pT2 = new Test(10);
delete pT2;
}
2.2.2 例二
#include <iostream>
using namespace std;
class Test
{
public:
Test(int _a) {
a = _a;
cout << "构造函数" << endl;
}
~Test() {
cout << "析构函数" << endl;
}
private:
int a;
};
// malloc free 属于C语言的函,只会分配和删除内存大小,不会调用类的构造函数和析构数
// new delete 属于C++的操作符,new和delete不光会分配内存和删除内存,还会调用构造函数和析构函数,就是会初始化对象
// 用malloc分配的内存可以用delete释放吗? 基础类型√ 基础类型数组√ 自定义对象√
// 用new分配的内存可以用free释放吗? 基础类型√ 基础类型数组√ 自定义对象√
void objplay2() {
int *p = (int *)malloc(sizeof(int));
*p = 10;
int *p2 = new int;//分配基础类型
*p = 20;
int *p3 = new int(30);
}
结论:
- malloc free 属于C语言的函, 只会分配和删除内存大小,不会调用类的构造函数和析构数
- new 和delete 属于C++的操作符,new和delete不光会分配内存和删除内存,还会调用构造函数和析构函数,就是会初始化对象
- 用malloc分配的内存可以用delete释放吗? 基础类型√ 基础类型数组√ 自定义对象√
- 用new分配的内存可以用free释放吗? 基础类型√ 基础类型数组√ 自定义对象√