题头的话:长按点赞可私我赠送50+本C与C++书籍电子书资源
C++动态内存的分配与释放
程序运行时可以使用的内存空间称为堆(heap)。堆内存就是在程序运行时获得的空间,在程序编译和连接时不必确定它的大小,它随着程序运行过程变化(故堆内存也称为动态内存)。
C++可以使用从C标准库中继承来的malloc() 和free()函数 (此时应用到头文件malloc.h ),h或者是使用new和delete运算符。
new运算符
运算符new用于分配堆内存:
指针变量=new 数据类型;
new从堆内存中为程序分配可以保存某种类型数据的一块内存空间,并返回该内存的首地址,该地址存放于指针变量中。
delete运算符
运算符delete用于释放new动态分配中的内存的首地址。
关于两者的注意事项
(1)用于new获取的内存空间,必须用delete进行释放。
(2)对于一个指针只能调用一次delete。
(3)用delete运算符作用的对象必须是用new分配的内存空间的首地址。
new与delete应用举例
#include<iostream>
using namespace std;
int main()
{
int *p;
p=new int;//分配内存空间
*p= 5;
cout<<*p;//释放内存空间
delete p;
}
用new运算符建立数组类型的变量
其形式为:
指针变量-new 数据类型[数组大小];
此时指针变量指向第一个数组元素的地址。使用new分配数组时,不能提供初始值。用于new获取的数组变量内存空间,也必须用delete进行释放。
使用形式为:
delete 指针变量; (释放变量)
delete []指针变量; (释放数组变量)
同样,也可以用new来为多维数组分配空间,但是除了第一位可以为变量外,其他维数都必须是常量。
int(*p)[10];
int n;
··· //可由用户对变量n赋值
p=new int[n][10];
···
delete []p;
//在使用delete时,不用考虑数组的维数。
如果未能获得所需空间,new返回0,即空指针。(程序员可以籍此判断是否有足够空闲内存供以程序使用),例如:
int *p=new int[100];
if(p==0)
{
cout<<"can't allocate more menory,terminating."<<endl;
exit(1);//exit()函数的作用时终止程序运行。
}
从堆内存中获取一个整型数组,赋值后打印出来
#include<iostream>
using namespace std;
void main()
{
int n; //定义数组元素的个数
int *p;
cout<<"Please intput the length of the array: ";
cin>>n;
if((p=new int[n])==0)
{
cout<<"can't allocate more menory,terminating."<<endl;
exit(1);
} //分配内存空间
for(int i=0;i<n;i++) p[i]=i*2;
cout<<"Now output the array:"<<endl;
for(int i=0;i<n;i++) count<<p[i]<<" ";
count<<endl;
delete[]p; //释放内存空间
}