new分配空间之后和delete释放空间之后

写了一个链表的程序,想实现一个ClearList函数,功能是清空链表,释放除头结点以外的所有空间。最初,我的实现如下:

template <class ElemType>
void LinkList<ElemType>::ClearList()
{
    LNode<ElemType>* p=head->next;
    LNode<ElemType>* q=NULL;
    while(p)
    {
        q=p->next;
        delete p;
        p=q;
    }

}

编译、链接都没问题,调用ClearList函数,跑起来也没有非常致命的错误指示。但是,控制台的最后一行偏偏少了一行字:

Press any key to continue···

好的,程序确实能是有问题了。修改一下,成功:

template <class ElemType>
void LinkList<ElemType>::ClearList()
{
    LNode<ElemType>* p=head->next;
    LNode<ElemType>* q=NULL;
    while(p)
    {
        q=p->next;
        delete p;
        p=q;
    }
    head->next=NULL;
}

delete释放空间之后,指针的值仍是原来指向的地址,而不是空值NULL。不能通过测试指针是否为NULL来判断该指针所指向的空间是否已经释放。

下面的一段话摘自高等教育出版社的《面向对象程序设计》:

当然,new分配存储空间并不保证每一次都成功。例如,当前没有足够的内存资源可供分配,这有可能是请求的内存太多、硬件资源不足,也有可能是程序有错,一直在申请分配内存但却没有释放任何内存。如果new分配存储空间失败,则返回给指针的值是一个空指针'\0',即一些标准库中定义的名字NULL。这时如果不考虑new操作是否成功,继续使用这个指针是很危险的。有经验的程序员在每次new操作后,都会判断内存分配是否成功,然后再决定下一步的操作,其模式如下:

CIRCULAR_NUMBERS* angle_ptr;

...

angle_ptr=new CIRCULAR_NUMBERS(0,359,250);

if(angle_ptr==NULL){

...

} else{

...

}

...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值