提问人:Roman 提问时间:11/9/2023 更新时间:11/9/2023 访问量:95
为什么成员变量的值会发生变化?
Why value of member variable is changing?
问:
下面是一个链表:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
struct Arrival
{
string arrAddress;
double distance;
string roadCategory;
struct Arrival* next;
};
class ArrivalList
{
private:
struct Arrival* head;
public:
bool addArrival(string oneAddress, double distance, string roadCategory);
};
bool ArrivalList::addArrival(string oneAddress, double distance, string roadCategory)
{
Arrival* temp;
Arrival* current=new Arrival();
current=head;
temp=new Arrival();
temp->arrAddress=oneAddress;
temp->distance=distance;
temp->roadCategory=roadCategory;
int f=0;
while(1)
{
if(current==NULL)
{
temp->next=NULL;
head=temp;
f=1;
break;
}
else if(oneAddress>=current->arrAddress && oneAddress<current->next->arrAddress)
{
temp->next=current->next;
current->next=temp;
f=1;
break;
}
else
{
current=current->next;
}
}
cout<<head->arrAddress;
if(f)
{
return true;
}
else
{
return false;
}
}
int main()
{
ArrivalList li;
li.addArrival("jjjjj",0.8999,"I");
li.addArrival("aaaaa",0.888,"k");
}
我希望 head 的值在对函数 addArrival 的多次调用中保持不变,但它正在发生变化。我想从“当前”值开始循环,这应该是第一次调用后的 head 值,但每次它都在变化并从 NULL 开始,我想。
我希望每次调用函数时,它都应该获得更新的 head 的值并开始循环,但是在第一次调用后该值没有保存为 head。
答:
1赞
Remy Lebeau
11/9/2023
#1
您的类没有初始化其成员,也没有在完成使用时释放列表,从而泄漏节点。ArrivalList
head
而且,您的方法还存在其他几个问题,包括:addArrival()
- 1 保证内存泄漏
- 1 如果未将新节点添加到列表中,则可能发生内存泄漏。
- 如果迭代到达列表末尾,则当您意外清除整个列表时,还会有几次内存泄漏。
- 如果迭代到达列表中的最后一个节点,则取消引用 null 指针。
请尝试更像这样的东西:
#include <iostream>
#include <string>
using namespace std;
class ArrivalList
{
private:
struct Arrival
{
string arrAddress;
double distance;
string roadCategory;
Arrival* next;
};
Arrival* head;
ArrivalList(const ArrivalList&) {}
ArrivalList& operator=(const ArrivalList&) { return *this; }
public:
ArrivalList();
~ArrivalList();
bool addArrival(string oneAddress, double distance, string roadCategory);
};
ArrivalList::ArrivalList() : head(NULL) {}
ArrivalList::~ArrivalList()
{
Arrival* current = head;
while (current)
{
Arrival* temp = current->next;
delete current;
current = temp;
}
}
bool ArrivalList::addArrival(string oneAddress, double distance, string roadCategory)
{
Arrival** current = &head;
while ((*current != NULL) && (oneAddress >= (*current)->arrAddress))
current = &((*current)->next);
Arrival* temp = new Arrival;
temp->arrAddress = oneAddress;
temp->distance = distance;
temp->roadCategory = roadCategory;
temp->next = *current;
*current = temp;
cout << head->arrAddress << endl;
return true;
}
int main()
{
ArrivalList li;
li.addArrival("jjjjj",0.8999,"I");
li.addArrival("aaaaa",0.888,"k");
li.addArrival("lllll",0.888,"k");
li.addArrival("kkkkk",0.888,"k");
}
在第一次调用时,列表为空,因此将添加为新的 .
jjjjj
head
在第二次调用时,是“小于”,因此它被添加为新的节点,并成为列表中的第二个节点。
aaaaa
jjjjj
head
jjjjj
在第三次调用时,是 “more than” ,因此它被添加为列表中的最后一个节点。
lllll
jjjjj
在第四次调用时,是“大于”和“小于”,因此它在列表中的这些节点之间添加。
kkkkk
jjjjj
lllll
评论
Arrival* current=new Arrival(); current=head;
内存泄漏就在那里。请先在下面运行它并修复它报告的所有错误。只有这样,其他人看代码才有意义......valgrind
Arrival * current = head;
else if
current->next->arrAddress
current
current->next