各位帮帮看看,用delete删除一个链表时为什么会出错
各位帮帮看看,用delete删除一个链表时为什么会出错?在线等
struct MM
{
int count;
struct MM * next;
}
struct GG
{
int a;
struct MM * head;
}
void addnode(struct GG * gg)
{
struct MM * p1 = gg-> head;
for(int i = 0; i < 11 ; i ++)
{
struct MM * p2 = new struct MM;
p1-> next = p2;
p1 = p2;
}
}
void deletenode(strcut MM * mm)
{
if(mm-> next != NULL)
deletenode(mm-> next);
delete mm; // 在.net环境下说,用户未处理异常
}
程序只要运行到 最后一句就报错.
------解决方案--------------------
void addnode(struct GG * gg)
{
struct MM * p1 = gg-> head;
for(int i = 0; i < 11 ; i ++)
{
struct MM * p2 = new struct MM;
p1-> next = p2;
p2-> next = NULL; //加这一句试试
p1 = p2;
}
}
------解决方案--------------------
变量应该是全局的吧
------解决方案--------------------
楼主传入addnode的实参是怎样的,估计是传入的参数有问题吧,有没有初始化一下
struct MM * p1 = gg-> head;
加上这句gg-> head-> next = NULL ;
另外的p2-> next = NULL ;也要加上
------解决方案--------------------
你调试下,看看delete对象那里的指针是类似未初始化的值吗?这是一种情况,
另外,如果确实是你new得到的指针那么估计就是你在其他的代码里对那个节点的操作出现越界、溢出的问题了,也要检查下
------解决方案--------------------
void deletenode(strcut MM * mm)
{
if(mm!=NULL)
{
if(mm-> next!=NULL)
deletenode(mm-> next);
else
delete mm;
}
}
------解决方案--------------------
我测试了下,应该是没有问题的啊。
如果是缺少这一句:p2-> next = NULL; //加这一句试试
在if 里面就会出错。
另外,楼主要说明白点,delete mm; 这句,会运行多次的,到底是第几次运行到这时才出的错。我怀疑是最后一次删除头节点的出错了,可能是因为你的头节点在定义的时候,并不是通过new为他动态申请了空间,结果导致删除出错。
比如这里:struct MM * p1 = gg-> head;如果p1是被作为了头节点,删除的时候可能就会出错。
------解决方案--------------------
void addnode(struct GG * gg)
{
struct MM * p1 = gg-> head;
for(int i = 0; i < 11 ; i ++)
{
struct MM * p2 = new struct MM;
p1-> next = p2;
p2-> next = NULL; //加这一句试试
p1 = p2;
}
}
------解决方案--------------------
因为其中一个节点的next没有初始化为null,而且没有分配过内存,删除一个不能删除的指针出错,就是这样
p2-> next = NULL; //加这一句试试,这样就可以了
因为C++的编译器delete NULL不会出错,呵呵
------解决方案--------------------
补充一下,删除当前节点后,同时要更新父节点的next = NULL
否则同样会出错
------解决方案--------------------
mark
struct MM
{
int count;
struct MM * next;
}
struct GG
{
int a;
struct MM * head;
}
void addnode(struct GG * gg)
{
struct MM * p1 = gg-> head;
for(int i = 0; i < 11 ; i ++)
{
struct MM * p2 = new struct MM;
p1-> next = p2;
p1 = p2;
}
}
void deletenode(strcut MM * mm)
{
if(mm-> next != NULL)
deletenode(mm-> next);
delete mm; // 在.net环境下说,用户未处理异常
}
程序只要运行到 最后一句就报错.
------解决方案--------------------
void addnode(struct GG * gg)
{
struct MM * p1 = gg-> head;
for(int i = 0; i < 11 ; i ++)
{
struct MM * p2 = new struct MM;
p1-> next = p2;
p2-> next = NULL; //加这一句试试
p1 = p2;
}
}
------解决方案--------------------
变量应该是全局的吧
------解决方案--------------------
楼主传入addnode的实参是怎样的,估计是传入的参数有问题吧,有没有初始化一下
struct MM * p1 = gg-> head;
加上这句gg-> head-> next = NULL ;
另外的p2-> next = NULL ;也要加上
------解决方案--------------------
你调试下,看看delete对象那里的指针是类似未初始化的值吗?这是一种情况,
另外,如果确实是你new得到的指针那么估计就是你在其他的代码里对那个节点的操作出现越界、溢出的问题了,也要检查下
------解决方案--------------------
void deletenode(strcut MM * mm)
{
if(mm!=NULL)
{
if(mm-> next!=NULL)
deletenode(mm-> next);
else
delete mm;
}
}
------解决方案--------------------
我测试了下,应该是没有问题的啊。
如果是缺少这一句:p2-> next = NULL; //加这一句试试
在if 里面就会出错。
另外,楼主要说明白点,delete mm; 这句,会运行多次的,到底是第几次运行到这时才出的错。我怀疑是最后一次删除头节点的出错了,可能是因为你的头节点在定义的时候,并不是通过new为他动态申请了空间,结果导致删除出错。
比如这里:struct MM * p1 = gg-> head;如果p1是被作为了头节点,删除的时候可能就会出错。
------解决方案--------------------
void addnode(struct GG * gg)
{
struct MM * p1 = gg-> head;
for(int i = 0; i < 11 ; i ++)
{
struct MM * p2 = new struct MM;
p1-> next = p2;
p2-> next = NULL; //加这一句试试
p1 = p2;
}
}
------解决方案--------------------
因为其中一个节点的next没有初始化为null,而且没有分配过内存,删除一个不能删除的指针出错,就是这样
p2-> next = NULL; //加这一句试试,这样就可以了
因为C++的编译器delete NULL不会出错,呵呵
------解决方案--------------------
补充一下,删除当前节点后,同时要更新父节点的next = NULL
否则同样会出错
------解决方案--------------------
mark