首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链表分段故障11

链表分段故障11
EN

Stack Overflow用户
提问于 2016-10-18 18:33:39
回答 1查看 101关注 0票数 0

我的一个作业出了点问题。我需要做一个链表连接,但是在重新定义operator+之后,我有分段错误。代码如下:

在main.cpp中:

代码语言:javascript
复制
case CONCAT:
        do
    {
      std::cout << "Which two list do you want to concat?(1-3) ";
      std::cin >> s;
            std::cin >> g;
            selectedlist =atoi(s.c_str());
            selectedlist2 =atoi(g.c_str());
    } while ((
                 selectedlist== 0 && 
                 s != "0" && 
                 (selectedlist > 3 || selectedlist < 1)
             ) && 
             (
                  selectedlist2== 0 && 
                  g != "0" && 
                  (selectedlist2 > 3 || selectedlist2 < 1)
             )
            );
        Lista[selectedlist-1]+Lista[selectedlist2-1];
        std::cout<<"Ready";

   break;

在头文件中:

代码语言:javascript
复制
class lista
{
    public:
        enum Exceptions{EMPTY};
        lista() : first(NULL),last(NULL),current(NULL){ first = new Elem(0,0);}
        virtual ~lista();
        lista(const lista& s);
        int Current() const {return current->Adat;}
        void First()   {current = first->next;}
        bool End()     const {return current==NULL;}
        void Next()    {current = current->next;}
        void Vegere(int e);
        void Elejerol();
        bool Urese();
        int Eleje();
        friend std::ostream& operator<<(std::ostream& s, const lista& a);
        friend lista operator+(lista& a, lista& b);

    private:
        struct Elem{
                    int Adat;
                    Elem* next;
                    Elem(int c, Elem* n): Adat(c), next(n){};
                    };
        Elem* first;
        Elem* last;
        Elem* current;
};

在lista.cpp中:

代码语言:javascript
复制
lista operator+(lista& a, lista& b)
{
  if(b.first->next!=NULL && a.first->next!=NULL)
    {
        a.last->next = b.first->next;
        a.last = b.last;
        b.first = new lista::Elem(0,0);
        b.last = NULL;
        b.current = NULL;
    }
   else
   {
        throw lista::EMPTY;
   }
    return a;
}

void lista::Vegere(int e) { 
  Elem* p = new Elem(e,0); 
  if(last==NULL) { 
     first -> next = p; 
     last = p; 
  } 
  else { 
    last -> next = p; 
    last = p; 
  } 
} 

它会报错,以及所有其他函数(空、加数字等)工作正常。我做错了什么?

代码语言:javascript
复制
void lista::Vegere(int e) 
{ 
    Elem* p = new Elem(e,0); 
    if(last==NULL) 
    { 
        first -> next = p; last = p; 
    } 
    else 
    { 
        last -> next = p; last = p; 
    } 
}

析构函数:

代码语言:javascript
复制
lista::~lista()
{
    Elem *p, *v;
    p = first;
    v = first -> next;
    while( v!=NULL)
    {
        delete p;
        p = v;
        v = v -> next;
    }
    delete p;
}

我已经弄明白了。我还没有在这里发布这部分代码,但经过一些调试,我已经得到了它。

下面是错误:

代码语言:javascript
复制
    lista::lista(const lista& s){
        if(s.first->next==NULL)
        {
            first->next = last = NULL;
        }
        else
        {
        Elem* q = new Elem(s.first->Adat,NULL);
        first = q;
        for(Elem* p=s.first->next;p!=NULL;p=p->next)
        {
            q = new Elem(p->Adat,NULL);
            q->next = q;
        }
        last = q;
        }

        current = first;

THIS PART is the error:
[
        while(current!=NULL && current->Adat!=s.current->Adat)
        {
            current=current->next;
        }
]
    }

我刚刚把它删除了,它起作用了。:)

EN

回答 1

Stack Overflow用户

发布于 2016-10-18 19:32:36

问题是

代码语言:javascript
复制
lista operator+(lista& a, lista& b)
{
    ...
    return a;
}

这会创建一个a的副本,然后立即销毁(因为您不会将其保存在任何地方)。您还没有定义复制构造函数,所以您得到了编译器定义的构造函数(它只复制指针)。临时函数的析构函数会删除a.first指向的内存,然后当你调用a的析构函数时,一切都会爆炸。

如果析构函数正在释放内存,则需要声明复制构造函数和复制赋值运算符。最简单的定义是删除它们(使用尾随的= delete;) -然后需要更改operator +的定义(可能是通过将函数名更改为append())。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40105890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档