C++学习 之 指针及动态内存分配(笔记)

1. 指针

  1.1 指针的含义:

  简单来说,指针是存储内存地址的变量。当我们声明了一个指针变量后,使用该指针时系统会根据指针内的地址索引内存块,读取内存内的值。指针因为是用来存地址的,所以一般固定长度为4个字节。void指针指向内存块的指针。

  指针的定义示例:

int a=0;

int *Pointer_a=&a;

 

  在编写程序时我们可以使用&(引用运算符或地址运算符)获取变量或常量的地址,例如上例中获取a变量地址就是用&a。对于指针来说指针本身存储地址,加上*(解除引用运算符)读取该地址下的值。如上例,Pointer_a存放的就是a的地址,*Pointer_a就是读取a的值。

  1.2 指针的运算(++和--):

  和数组具有相似之处,指针也可以进行地址运算。

  我们可以用指针遍历数组试试:

int Array[5]={1,2,3,4,5};
int *p=Array;//Array存放的为数组的第一个元素的地址
for(int i=0;i<5;i++)
{
    cout<<"Array["<<i+1<<"]: "<<*p<<endl;
    p++;
}

2.动态内存分配

  2.1使用new和delete动态分配和释放内存:

  new可以申请分配一个内存块(申请不一定会成功受限于系统的状态),如果成功则返回指向一个指针,指向分配的内存,否则会出现异常。delete用于释放new所分配的空间,当我们使用new分配的空间不在使用时,一定要及时释放否则会拖慢系统。

  动态内存分配示例:

  

int* p, * p_copy, number = 0;

 

cout << "请输入需要存放的整数数量:";
cin >> number;
p = new int[number];//根据需要动态分配内存空间
p_copy = p;//存储p的初始地址

 

cout << "请输入各整数(用空格隔开):";
for (int i = 0; i < number; i++)//输入各整数
{
  cin >> *p_copy;
  p_copy++;
}
for (int i = 0; i < number; i++)//输出动态分配的空间内的各整数值
{
  cout <<"第"<<i+1<<"整数为:"<<*p<<endl;
  p++;
}

  

  2.2动态分配内存空间的注意事项:

  使用new分配内存空间后没有释放,导致程序运行时间越长系统越慢。要注意在new和delete的配合使用,否则会导致内存泄漏问题。在我们对原本有效的指针使用delete后指针便变为无效指针,此时指针为悬浮指针。还有就是指针在被定义之后没有指向内存空间或存储变量地址,这样的指针也是无效的。对无效指针解除引用程序往往会出现异常。所以,我们可以把指针初始化为NULL,使用前对指针是否有效进行检查。

  2.3动态分配内存空间异常处理:

  如果在使用new时分配不成功,将使得程序中断,并弹出错误窗口。对此我们可以编写异常处理程序,在分配成功时正常执行,不成功时也能妥善退出。

  例如:

 

try
{
    int *p=new int [536870911];
    delete [] p;
}
catch (bad_alloc)
{
    cout<<"内存分配失败,程序结束"<<endl;
}

 

  或者使用new(nothrow),在分配失败时返回NULL。

  例如:

int *p=new(nothrow)int [0x1fffffff];
if(p)//检查p是否为空
{
    delete [] p;//当p为空时,释放p的内存
}
else
    cout<<"内存分配失败,程序退出"<<endl;

 

 

  

posted @ 2019-07-25 14:32  望烟听雨寒  阅读(4219)  评论(0编辑  收藏  举报