c++问题,求高手帮分析一下原因

空云万里晴 发布于 2011/10/15 13:15
阅读 289
收藏 0
请看下面两段代码,分析一下他们的区别,并提一些应该注意的地方!!
先感谢了!!!
代码一:
Link_List<T> mergelist(Link_List<T> &list)//合并链表
{
Node<T> *p = head->next;
while(p->next!=NULL)
{
p = p->next;
}
p->next = list.head->next;
size = size+list.size;
return *this;
} 
代码二:
Link_List<T> &mergelist(Link_List<T> &list)
{
Node<T> *p = head->next;
while(p->next!=NULL)
{
p = p->next;
}
p->next = list.head->next;
size = size+list.size;
return *this;
}
加载中
0
空云万里晴
空云万里晴
第一段代码运行结果
0
空云万里晴
空云万里晴
同样“&list”改成“list”也不能正常运行
0
空云万里晴
空云万里晴
是内存泄漏吗?
0
hello123
hello123

Node<T> *p = head->next;
如果head->next为NULL,会出错吧
p->next = list.head->next; 就会出问题了

0
公岩
不会是内存泄漏的,是指针的问题,具体的话还是自己单步调试看一下,应该很容易就知道了
0
hac2009
hac2009

第一种返回Link_List<T>,return *this;相当于复制*this给一个临时变量,调用这个函数的从临时变量取数据,然后释放临时变量。要正常调用,需要在类中重载复制构造函数和赋值操作符。

第二种方法实质是返回对象的地址,因此不会有问题。

springfieldking
springfieldking
小数据返回前放入寄存器,大数据压栈。
hello123
hello123
第一种方法返回时会调用拷贝构造函数创建一个新对象;第二种方法只接返回当前对象,可以实现级联调用。这两种方法,都属于正确调用
0
Lunar_Lin
Lunar_Lin
  代码一很危险.   PS:这问题不需要高手. 细节同hac2009.默认的复制构造函数和赋值操作函数对于这种内部有new的代码很危险.
0
j
jonnie

有两个问题

1)  没有判断List类是否为空

2)  把List2中的节点直接链接到本List1中,如果节点在list2中被delete,那list1就会出错了  -- 用智能指针避免

0
hnynes
hnynes

第一种方法,需要自己写拷贝构造函数,否则很可能会引起错误,至于错误是什么,就得看你的应用了.

返回顶部
顶部