为什么这段代码会产生seg错误?

时间:2015-10-11 16:16:16

标签: c++ linked-list stack pop

我有类stackLL和pop()函数在main中使用时会产生seg错误。这是代码: 这是结构和类定义:

struct llNode{
int data;
llNode* next;
};

class stackLL{
public:
stackLL();
void push(int x);
int pop();
void print();

private:
llNode* head;
};

这里是成员函数定义:

int stackLL::pop(){
    if (head == NULL){
    return false;
    }

    else {
    llNode *tmp= new llNode;
    cout<<"The integer is: "<<head -> data;
    tmp = head;
    head = tmp -> next;
    delete tmp;
    return tmp -> data;

    }
}

这里是main中的实现:

stackLL sll;

几行

 sll.pop();

3 个答案:

答案 0 :(得分:5)

// Pseudo code

    obj1 = {
        xy: {
            x: 'foo',
            y: this.x + 'bar'
        }
    }

// Working

obj2 = {
    xy: (function() {
        x = 'foo',
        y = console.log(this.x + 'bar')
    })()
}

// need to access stuff like this

obj1 = {
    xy: {
        x: 'foo',
        y: this.x + 'bar'
    }
    z: xy.y
}

您在返回数据前删除delete tmp; return tmp -> data; 。您实际上是在返回不存在或已经失效的数据 动态分配tmp不是必需的;你可以自动分配tmp(即tmp)。那也可以摆脱段错误。

此外,llNode tmp = head;的代码可能没有按照您的意图执行(或者至少,它没有执行链接列表的pop功能)。

此外,你绝不应该使用空白popnew(它容易出错)。相反,使用其中一个智能指针,最好是deletestd::unique_ptr<...>没有引用计数器)

答案 1 :(得分:3)

你对seg故障感到惊讶吗?

delete tmp;
return tmp -> data;

答案 2 :(得分:0)

在恢复temp-&gt;数据之前,在pop()函数中,您实际上正在删除该临时节点。这就是你得到分段错误的原因。