c++动态内存分配与异常检测

#include

using namespace std;

//c++中动态内存分配和c语言中的比较

//在c语言中,动态分配内存使用malloc来申请,该函数返回一个void *类型的指针,使用者在使用时需要自己手动设置每一块内存的具体占用的字节数
//比如(char *)malloc(sizeof(int));该语句返回一个指针,指向一段地址,该段内存的大小为sizeof(int),被分为一个个char大小的内存块
//c语言中动态申请的内存都是从堆空间指定的,需要使用者手动释放,释放动态申请的内存使用free(),传入地址入口即可手动释放

//在c++中提供一套新的申请和释放内存的关键字,new,delete,同样的也是从堆空间上申请,同样的也需要释放
// 例如,定义一个int y;声明一个指针指向int类型的一段内存的首地址或者一个数据的地址,现在需要手动给他赋值,即y = new int;现在y已经被实例化,
// y现在是有大小的,可以使用的,同样的可以支持
y 来解引用它,可以使用*y = 10;来给y赋值,同样释放时需要delete y;上述的变量的声明和初始化也可以使用一句话
//处理 int *p = new int(5);这实际使用了c++的构造函数,定义的时候就初始化。

int main(int argc, char *argv[])
{
char a[2][2] = {‘a’,‘b’,‘c’,‘d’};
printf("%p\n",a);
printf("%p\n",&a[1][0]);
cout << “Hello World!” << endl;
return 0;
}
//一维数组和二维数组的使用

//有时候程序在运行的中间,需要动态地申请一段内存存放某一类型的数组元素,可以使用float *y = new float[n];上述就表示申请一个float类型的数组,存放n个float类型的元素
//在使用New来动态申请内存时,假设系统分不出来,或者由于某些原因内存申请失败,c++有异常处理系统,可以使用异常捕获来查看具体是否是失败或者成功。
//一般地在编写c++程序时将最可能或者说最容易出现异常的代码写在一个块内,在该块内使用异常捕获机制来监测代码的异常或者非异常。组织形式如下
//try{
//} 此处申请
//catch
//{
// 此处抛出异常
//}

//二维数组,二维数组在程序中的组织形式,二维数组在形式上看起来像是一个二维的矩阵,但是在内存模型中的组织形式其实也是线性存放的,
//与一维数组不同的是,二维数组在内存中是先存放二维数组的一行数据,在第一行数据结束后,接着存放第二行的第一个数据,以此类推进行线性存放。
//使用模板动态创建一个二维数组如下

template

bool Make_2DArray(T **p,int rows,int cols)
{
try{
x = new T[rows]; //为每一行分配一个内存空间,经过这里已经分配出了所有行所需要的内存大小
for(int i = 0; i < rows;i++ )
x[i] = new int[cols];
}
catch(xalloc) //只有捕获到异常时才会进入
{
cout<<“malloc Error!”<<endl;
return false;
}
return true;
}

//删除创建的二维数组
template
bool Delete_2DArray(T **p,int rows,int cols)
{
try{
for(int i = 0; i < cols; i++)
delete x[][i]; //先删除每一行中的元素,然后在删除你所申请的列数
delete[]x;
x = 0;
}
catch()
{
cout<<“malloc Error!”<<endl;
return false;
}
return true;
}

//删除和创建时候的问题:在动态创建一个二维数组时,需要由外到内,删除时,需要由内到外。

猜你喜欢

转载自blog.csdn.net/weixin_41218453/article/details/86522660