在释放内存之时,不仅仅是将该块内存进行释放,还要将指向该块内存的指针置为NULL。如果不置为NULL,下次继续使用该指针时会出现问题。具体看示例。在下面的示例中,如果没有处理野指针的那句话,最后链表输出的结果会被输入的多一位,原因就在于尾插节点之后虽然释放了最后一个无效节点的内存,但却没有将无效节点的前一个节点的next指针重置为NULL。
总之一句话,free或者delete只是将指针指向的内存进行释放,却并没有对指针做任何操作。
#include <iostream>
using namespace std;
int main()
{
int *p=new int;
if (p==NULL)
{
//判断指针p是不是空指针,如果是空指针,那么程序在这里就应该报错
//报错的方法有很多,比如说返回一个ERROR值:
//return ERROR;
}
//判断了操作成功之后我们才能进行一系列的操作
//...
//用完指针p之后,一定要将其删掉。这样可以杜绝野指针的存在
delete p;
//删除指针p之后,一定要加上下面这句话,免得成为野指针
p=NULL;
}
struct node
{
string value;
node *next = NULL;
};
int len = 0;
int k=0;
string strV;
getline(cin,strV);
stringstream ssV(strV);
string strtmp;
node *head = new node;
node *q = head;
node *preNode = NULL;
while(getline(ssV,strtmp,' '))
{
//cout<<strtmp<<endl;
q->value = strtmp;
node *p = new node;
preNode = q;
q->next = p;
q = q->next;
}
preNode ->next = NULL;//野指针问题,如果没有这句话在输出链表的时候会有问题
delete q;
int vnum = 0;
while(head)
{
cout<<head->value<<" ";
head = head->next;
vnum++;
}
cout<<vnum<<endl;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)