为什么成员变量的值会发生变化?

Why value of member variable is changing?

提问人:Roman 提问时间:11/9/2023 更新时间:11/9/2023 访问量:95

问:

下面是一个链表:

#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。

C++ 链接列表 指向成员的指针

评论

1赞 Andrej Podzimek 11/9/2023
Arrival* current=new Arrival(); current=head;内存泄漏就在那里。请先在下面运行它并修复它报告的所有错误。只有这样,其他人看代码才有意义......valgrind
0赞 Roman 11/9/2023
如何解决内存泄漏,兄弟?
1赞 Tim Roberts 11/9/2023
你说.您是否在调试器中运行过它?问题发生在您引用的行中。仅仅因为有价值并不意味着有价值。Arrival * current = head;else ifcurrent->next->arrAddresscurrentcurrent->next
1赞 PaulMcKenzie 11/9/2023
你或你班上的其他人在这里问了同样的问题
1赞 Remy Lebeau 11/9/2023
这不仅是同一个问题,甚至是同样的错误代码!

答:

1赞 Remy Lebeau 11/9/2023 #1

您的类没有初始化其成员,也没有在完成使用时释放列表,从而泄漏节点。ArrivalListhead

而且,您的方法还存在其他几个问题,包括: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");
}

在线演示

  • 在第一次调用时,列表为空,因此将添加为新的 .jjjjjhead

  • 在第二次调用时,是“小于”,因此它被添加为新的节点,并成为列表中的第二个节点。aaaaajjjjjheadjjjjj

  • 在第三次调用时,是 “more than” ,因此它被添加为列表中的最后一个节点。llllljjjjj

  • 在第四次调用时,是“大于”和“小于”,因此它在列表中的这些节点之间添加。kkkkkjjjjjlllll