new分配空间之后和delete释放空间之后
2011-09-18 11:36
323 查看
写了一个链表的程序,想实现一个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{
...
}
...
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{
...
}
...
相关文章推荐
- C++之动态空间分配与释放:new & delete
- new/new[]和delete/delete[]是如何分配空间以及释放空间的
- 使用delete释放new[]的空间造成的错误分析
- C与C++中内存分配释放-malloc,free,new,delete
- delete 基类指针 释放为派生类分配的空间
- oralce中,delete表之后释放表空间的问题
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- 模拟new[]和delete[]操作符开辟内存空间及释放内存空间过程
- C++ 动态存储空间的分配和释放 new与malloc的区别
- C++ 动态存储空间的分配和释放 new与malloc的区别
- C与C++中内存分配释放-malloc,free,new,delete
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- delete 指针之后 ,只是释放了指针指向的内存空间,指针不会自动置为NULL,还有delete 遇到指针为NULL时不会调用析构函数
- 用new和delete运算符进行动态分配和撤销存储空间
- C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete
- 使用delete释放new[]的空间造成的错误分析
- g++ 下 new[] 之后用delete释放 会提示 munmap_chunk()
- C++:多维数组的动态分配(new)和释放(delete)
- new、delete、指向连续空间的指针、数组、空间释放、空间申请
- 动态内存分配(new)和释放(delete)