指针内存释放


这里介绍指针内存释放的三点注意事项;

一 。指针内存释放,有多少个new,就要有多少个delete。

大家先看下面的程序:

 char **PP =new char *[3];
    for (int j=0; j<3; j++)
    {
       PP[j]=new char[10];
    }

    for (int j=0; j<3; j++)
    {
        if(PP[j] != NULL)
        {
            delete [ ]PP[j];
            PP[j] = NULL;
        }
    }
    delete [ ]PP;
    PP = NULL;
 

我们先是定义了一个指向三个元素的数组指针,然后给这三个数值指针开辟新的10个空间;后面释放内存,开辟四次,就必须要释放四次;

再看看下面的赋值程序: 

  char **PP =new char *[3];
    for (int j=0; j<3; j++)
    {
       PP[j]=new char[10];
       cout<<"&PP[j]="<<&PP[j]<<endl;
       cout<<"PP["<<j<<"]="<<PP[j]<<endl;
       cout<<"*PP["<<j<<"]="<<*PP[j]<<endl;
       strcpy(PP[j],"ABCD");  ///<这里是把指针PP[i]的指向"ABCD"的首地址,指针PP[i]的地址没有任何改变
        //PP[j]="ABCD"; ///<这里是值把指针PP[i]的指针改变为r142的地址,现在改变了PP[i]指针的地址
        cout<<"&PP[j]="<<&PP[j]<<endl;
        cout<<"PP["<<j<<"]="<<PP[j]<<endl;
        cout<<"*PP["<<j<<"]="<<*PP[j]<<endl;
        cout<<endl;
    }

    for (int j=0; j<3; j++)
    {
        if(PP[j] != NULL)
        {
            delete [ ]PP[j];
            PP[j] = NULL;
        }
    }
    delete [ ]PP;
    PP = NULL;


值得注意的是,把strcpy(PP[j],"ABCD")去掉,用PP[j]="ABCD";你会发现程序会报错,只运行到delete [ ]PP[0];就停止了,而用strcpy(PP[j],"ABCD")去掉PP[j]="ABCD"是可以的,这是为什么呢?

原因:1.strcpy(PP[j],"ABCD"); 这里是把指针PP[i]的指向"ABCD"的首地址,指针PP[i]的地址没有任何改变,所有可以正常delete。

            2.PP[j]="ABCD"; ///<这里是把指针PP[i]的地址改变为“ABCD”的地址,现在PP[i]指针的地址已经不是char[10]的首地址了,然后delete就删除了“ABCD”的地址。

 

二     避免野指针的出现

    char * sas= new char[3];
    //char  *q=sas;
    *(sas++)='a';
    *(sas++)='b';
    *(sas)='c';   
    delete sas;///<有问题,因为现在指针指向第三个位置,只删除了‘c’的内存,‘a'和'b'的都没有删除啊 
     sas = null;
    //delete q;///<OK,q来记录sas刚开始指向的首地址,所有可以 
    //q=NULL;  

问题的原因上面已经给出,a,b的内存就没有删除,造成的内存泄露。

克服办法:

    1.方法一,指针回去,就行SS--,回到原点,再delete,
    2.  方法二,之前定义一个指针,记录指针的地址,char *MM=SS; 最后delete MM

三 new/delete\new xx[] / delete [] xx  需要配对使用。

    char * p= new char[10];
    int i=0;
    for( i=0; i<10; i++)
    {
        p[i]='a'; ///<
        cout<<"p["<<i<<"]"<<p[i]<<endl;
    }
    delete[] p; 
    p=NULL;

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值