最近学了C语言版的数据结构,一堆堆都是动态空间的分配问题,丫的,一堆堆的malloc函数,分配失败又如何如何的……⊙﹏⊙b汗,真是相当麻烦,自己还是喜欢用C++的new和delete,于是毅然决定稍稍把之前学过的C++内容稍稍的总结一下。
C语言是利用malloc函数和free这两个库函数完成动态存储分配和释放存储空间的功能的。
函数原型为:
void *malloc(size_t size)
void free(void *p)
C风格的动态内存分配和释放
#include
#include
#include
void main()
{
char *ptext;
ptext = (char*)malloc(sizeof(char)*80);
strcpy(ptext,”c风格的内存分配”);
if(ptext==NULL)
{
printf(“分配内存失败\n”);
return 0;
}
printf(“%s\n”,ptext);
free(ptext);
}
ptext = (char*)malloc(sizeof(char)*80); →这个系统的内存没这么大就申请不下来就是空
↓
这个表示是将void转换成char类型,具体看一下原型就懂
所以后面才会有个判断ptext是否为空的语句。
程序的输出就是:
c风格的内存分配。
如果没有足够的内存可以分配就是输出:
分配内存失败。
malloc和free的缺点:
1)malloc函数的参数,要计算内存大小
2)malloc函数返回类型是void *,程序员必须自己转化一下指针类型。
C++中拥有的新运算符:new和delete函数
优点:
1)自动分配类型大小
2)自动返回指针类型
3)可以用new将分配的存储空间初始化
运算符new用于内存分配时的使用形式为:
指针变量名 = new [(指针基类型名表达式)|[整式类型名]];
“指针基类型”是指针变量指向的类型。如果没有方括号中的选项,那么new 将分配一个指针及基类的单元,并返回那个单元的地址给指针变量。
如:
double *p;
p= new double;
1)圆括号()中的指针基类型,意思就是用表达式的值来初始化指针指向的单元
p = new double (1.0);
单元地址的初始值就是1.0
2)方括号 []里的整形表达式就是要分配一个数组,表达式的值是数组的长度。
p=new double[10];
用p指向了长度为10的double数组的第一个元素。相当于double p[10];
会用到的功能p=new double [n]; n可以输入进来
删除的时候注意:
用圆括号,直接delete p
用方括号 delete []p ,不需要考虑要回收空间的大小就ok了。 删的是数组
动态分配和释放单个存储区的例子
#include
using namespace std;
int main()
{
int *p;
p=new int;
if(!p) //即p==NULL
{
cout<<”内存分配错误”<<endl;
return 1;
}
*p=20;
cout<<*p<<endl;
delete p;
return 0;
}