【问题标题】:Segmentation Fault because of Pointers由于指针导致的分段错误
【发布时间】:2011-03-16 20:55:11
【问题描述】:

我一直有很多麻烦,因为我忘记了指针的所有规则。我在 3 年前了解了指针,从那以后就没有使用过它们。我在 LinkedList.cpp 文件中的函数 add 中的行 contents -> setPrevious(&node) 中收到分段错误。我相信这与调用 setPrevious 函数或将节点作为指针传递有关。任何帮助都会很棒。谢谢!

LinkedList.h

#ifndef LINEARNODE_H
#define LINEARNODE_H

#include<iostream>

using namespace std;

class LinearNode
{
    public:
        //Constructor for the LinearNode class that takes no arguments 
        LinearNode();
        //Constructor for the LinearNode class that takes the element as an argument
        LinearNode(int el);
        //returns the next node in the set.
        LinearNode* getNext();
        //returns the previous node in the set
        LinearNode* getPrevious();
        //sets the next element in the set
        void setNext(LinearNode* node);
        //sets the previous element in the set
        void setPrevious(LinearNode* node);
        //sets the element of the node
        void setElement(int el);
        //gets the element of the node
        int getElement();

    private: 
        LinearNode* next;
        LinearNode* previous;
        int element;        
};//ends the LinearNode class

#endif

LinkedList.cpp

#include<iostream>
#include"LinearNode.h"
#include"LinkedList.h"

using namespace std;

//linkedlist constructor for an empty linked list
LinkedList::LinkedList()
{
    count = 0;
    contents = NULL;
}//ends the constructor

//adds an element to the front of the linked list
void LinkedList::add(int element)
{

    int found = 0, current = 0;

    for (int index = 0; index < count; index++)
    {
        if (contents -> getElement() == element)
            found = 1;
        else    
        {

            contents = contents -> getNext();
        }//ends the else statement
    }//ends the while loop

    if ((found == 0) && (count == 0))
    {
        LinearNode node;
        node.setElement(element);
        contents = &node;
        count++;
print();
    }//ends the if statement
    else
    {

        LinearNode node;
        node.setElement(element);
        node.setNext(contents);
        contents -> setPrevious(&node);
        contents = &node;
        count++;
//print();
cout << endl;
    }//ends the found == 0 if statment
}//ends the add function

//this function removes one element from the linked list.
int LinkedList::remove(int element)
{
    int found = 0, result = 0; 
    LinearNode* previous;
    LinearNode* current;

    if (count == 0)
        cout << "The list is empty" << endl;
    else 
    {
        if (contents -> getElement() == element)
        {
            result = contents -> getElement();
            contents = contents -> getNext();
        }//ends the contents.getElement() == element
        else 
        {
            previous = contents;
            current = contents -> getNext();
            for (int index = 0; ( (index < count) && (found == 0) ); index++)
                if (current -> getElement() == element)
                    found = 1;
                else
                {
                    previous = current;
                    current = current -> getNext();
                }//ends the else statement 

            if (found == 0)
                cout << "The element is not in the list" << endl;
            else
            {
                result = current -> getElement();
                previous -> setNext(current -> getNext());
            }//ends else statement  

        }//ends the else stamtement

        count--;
    }//ends the else statement of count == 0
    return result;
}//ends the remove function


void LinkedList::print()
{
    LinearNode* current;
    current = contents; 

    for (int index = 0; index < count; index++)
    {
        cout << current -> getElement() << endl;
        current = current -> getNext();
    }//ends the for loop
}//ends Print function

线性节点.h

 #ifndef LINEARNODE_H
#define LINEARNODE_H

#include<iostream>

using namespace std;

class LinearNode
{
    public:
        //Constructor for the LinearNode class that takes no arguments 
        LinearNode();
        //Constructor for the LinearNode class that takes the element as an argument
        LinearNode(int el);
        //returns the next node in the set.
        LinearNode* getNext();
        //returns the previous node in the set
        LinearNode* getPrevious();
        //sets the next element in the set
        void setNext(LinearNode* node);
        //sets the previous element in the set
        void setPrevious(LinearNode* node);
        //sets the element of the node
        void setElement(int el);
        //gets the element of the node
        int getElement();

    private: 
        LinearNode* next;
        LinearNode* previous;
        int element;        
};//ends the LinearNode class

#endif

线性节点.cpp

#include<iostream>
#include"LinearNode.h"

using namespace std;

//Constructor for LinearNode, sets next and element to initialized states
LinearNode::LinearNode()
{
    next = NULL;
    element = 0;
}//ends LinearNode default constructor

//Constructor for LinearNode takes an element as argument.
LinearNode::LinearNode(int el)
{
    next = NULL;
    previous = NULL;
    element = el;
}//ends LinearNode constructor

//returns the next element in the structure
LinearNode* LinearNode::getNext()
{
    return next;
}//ends getNext function

//returns previous element in structure
LinearNode* LinearNode::getPrevious()
{
    return previous;
}//ends getPrevious function

//sets the next variable for the node
void LinearNode::setNext(LinearNode* node)
{
    next = node;

}//ends the setNext function

//sets previous for the node
void LinearNode::setPrevious(LinearNode* node)
{
    previous = node;
}//ends the setPrevious function

//returns element of the node
int LinearNode::getElement()
{
    return element;
}//ends the getelement function

//sets the element of the node
void LinearNode::setElement(int el)
{
    element = el;
}//ends the setElement function

【问题讨论】:

  • 你复制了两次Linearnode.h,在这里我们看不到LinkedList.h。

标签: c++ pointers segmentation-fault


【解决方案1】:
    LinearNode node;
    node.setElement(element);
    contents = &node;
    count++;

这将在堆栈上创建一个 LinearNode,使 contents 指向此节点,将范围留在以下 } - 这使 node 无效 - 并且 contents 随后指向无效数据。

你需要重新考虑你的整个班级——链表需要堆存储,所以你必须使用newdelete

您的来源中还有其他几个错误,但您应该先纠正这个基本的误解,然后在需要时提供更新的问题。

其他一些错误:

  • 缺少复制构造函数、赋值运算符和析构函数
  • 在取消引用指针之前不检查 null
  • 未在构造函数中将所有指针设置为 null

【讨论】:

  • 好的,我修复了它,使其 LinearNode* node = new LinearNode 但我仍然遇到分段错误。它发生在 LinearNode.cpp 文件中的 previous = node 时
【解决方案2】:

问题是您没有在堆中分配节点,而只是在堆栈中。

添加功能中

 LinearNode node;
 node.setElement(element);
 contents = &node;
 count++;

应该是:

 LinearNode* node = new LinearNode;
 node->setElement(element);
 contents = node;
 count++;

【讨论】:

  • 这就是我大部分时间使用python的原因
【解决方案3】:

寻找每一个小问题都需要大量的代码,但是跳出来的一件坏事是在 LinkedList::add() 中。在那里,您在堆栈上声明“节点”,然后设置一个指向它的指针。当 add() 返回时,指向的对象变成垃圾——析构函数被调用。这种情况会很快导致段错误。

【讨论】:

    最近更新 更多