目录
背景
1)在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。
注意: 第一,new和delete是运算符,不是函数,因此执行效率高;第二,这两个操作符是C++特有的。
2)虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符。
用运算符"new"可以完成:基础类型变量、分配数组变量、分配类对象的分配内存。
基本语法
new和delete运 算符使用的一般格式为:
如果新开的是一个变量:
new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100); //开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
如果新开是一个数组:
new char[10]; //开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
new int[5][4]; //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p
举例说明
C与C++语言分配基础类型方式对比
对比同样是分配内存,在C语言中的操作:
分配基础类型
void main1301()
{
//
int *p = (int *)malloc(sizeof(int));
*p = 10;
free(p);
cout<<"hello..."<<endl;
system("pause");
return ;
}
在C++中分配内存是, 这么做的:
void main1301()
{
int *p2 = new int; //分配基础类型
*p2 = 20;
free(p2);
cout<<"hello..."<<endl;
system("pause");
return ;
}
这里再列举一个语法,如何在分配的同时,进行初始化:
void main1301()
{
int *p3 = new int(30);
printf("*p3:%d \n", *p3);
delete p3;
cout<<"hello..."<<endl;
system("pause");
return ;
}
直接在int(),中加入想初始化的值。
C与C++语言分配数组变量的方式对比
在C语言中分配数组:
//分配数组变量
void main1302()
{
//c语言分配数组
int *p = (int *)malloc(sizeof(int) * 10); //int array[10];
p[0] = 1;
free(p);
cout<<"hello..."<<endl;
system("pause");
return ;
}
在C++中分配数组:
//分配数组变量
void main1302()
{
//c++分配数组
int *pArray = new int[10] ;
pArray[1] = 2;
delete [] pArray; //数组不要把[] 忘记
cout<<"hello..."<<endl;
system("pause");
return ;
}
要牢记delete时候,不要把数组的"[]"给忘了!
如何指定字符串的字节数量来分配内存呢?比如,要分配一个25个字节的字符数组(用字符数组来模拟字符串):
void main1302()
{
char *pArray2 = new char[25] ; //char buf[25]
delete [] pArray2;
cout<<"hello..."<<endl;
system("pause");
return ;
}
C++语言中动态分配对象的方式
先定义一个类:
class Test
{
public:
Test(int _a)
{
a = _a;
cout<<"构造函数执行" <<endl;
}
~Test()
{
cout<<"析构函数执行" <<endl;
}
protected:
private:
int a;
};
在主函中进行调用:
//分配对象new delete
//相同 和 不同的地方 new能执行类型构造函数 delete操作符 能执行类的析构函数
void main()
{
//c
Test *pT1 = (Test *)malloc(sizeof(Test));
free(pT1);
//c++
Test *pT2 = new Test(10);
delete pT2;
cout<<"hello..."<<endl;
system("pause");
}
以上两种方法,都可以给对象分配内存空间,但还是又些许的不一样的。用new创建的对象,可以自由的动态调用类写的构造函数;同样,delete可以自由的动态调用类写的析构函数;而这是,C语言中的那种写法所不具备的。
new和delete的深入分析
1. 如果用new创建的一个基础类型的时候,然后,用free去释放,结果是可运行;同理,如果是用malloc去创建一个基础类型,用delete去释放,同样也会可运行。对于创建的对象是基础类型的时候,创建和释放的运算符不匹配是可以的。
2. 如果用new创建的一个数组类型的时候,然后,用free去释放,结果是可运行;同理,如果是用malloc去创建一个数组类型,用delete去释放,同样也会可运行。对于创建的对象是数组类型的时候,创建和释放的运算符不匹配是可以的。
3. 如果用new创建的一个对象的时候,然后,用free去释放,结果是可运行,但是,会发现没有执行一个析构函数;同理,如果是用malloc去创建一个对象,用delete去释放,同样也可运行。但是,会发现没有执行了一个构造 函数。对于创建的对象是对象的时候,创建和释放的运算符不匹配虽可运行,但没有执行析构或者构造函数。
结论:
malloc和free是属于C语言语法的运算符,只会分配内存,但不会调用类的构造和析构函数;new和delete是属于C++语言语法的运算符,不只会分配内存,还会调用类的构造和析构函数来完成对象的初始化。
总体代码
dm13_new和delete.cpp
#include <iostream>
using namespace std;
// 1
// malloc free c语言的函数
// new delete 操作符 c++的语法
//2 new 基础类型变量 分配数组变量 分配类对象
//3
分配基础类型
void main1301()
{
//
int *p = (int *)malloc(sizeof(int));
*p = 10;
free(p);
int *p2 = new int; //分配基础类型
*p2 = 20;
free(p2);
//
int *p3 = new int(30);
printf("*p3:%d \n", *p3);
delete p3;
cout<<"hello..."<<endl;
system("pause");
return ;
}
//分配数组变量
void main1302()
{
//c语言分配数组
int *p = (int *)malloc(sizeof(int) * 10); //int array[10];
p[0] = 1;
free(p);
//c++分配数组
int *pArray = new int[10] ;
pArray[1] = 2;
delete [] pArray; //数组不要把[] 忘记
char *pArray2 = new char[25] ; //char buf[25]
delete [] pArray2;
cout<<"hello..."<<endl;
system("pause");
return ;
}
class Test
{
public:
Test(int _a)
{
a = _a;
cout<<"构造函数执行" <<endl;
}
~Test()
{
cout<<"析构函数执行" <<endl;
}
protected:
private:
int a;
};
//分配对象new delete
//相同 和 不同的地方 new能执行类型构造函数 delete操作符 能执行类的析构函数
void main()
{
//c
Test *pT1 = (Test *)malloc(sizeof(Test));
free(pT1);
//c++
Test *pT2 = new Test(10);
delete pT2;
cout<<"hello..."<<endl;
system("pause");
}