0

これにより SegFault エラーが発生するのはなぜですか? gdb でバックトレースを実行しようとしましたが、何の助けにもなりませんでした。何か助けていただければ幸いです。私はこれについて何時間も髪を引っ張ってきました。

私のnode.h

#ifndef NODE_H
#define NODE_H

#include <string>
using namespace std;

class Node
{
  public:

    Node(const string, const int) ;
   ~Node() { }
    void setNext(Node *);//setter for the next variable
    Node * getNext();// getter for the next variable
    string getKey();// getter for the key variable
    int getDistance();   // getter for the dist variable

  private:
    Node *next;
    int dist;
    string key;
};

#endif

私のNode.cpp

#include "node.h"
#include <string>

Node::Node(string k, int d){
    key = k;
    dist = d;
}

void Node::setNext(Node * n){
    next = n;
}

Node * Node::getNext(){
    return next;
}

string Node::getKey(){
return key;
}

int Node::getDistance(){
    return dist;
}

私のリスト.h

#ifndef LIST_H
#define LIST_H

#include "node.h"

class SLL
{
    public:
        SLL();
        ~SLL() { }
               void Insert (string searchKey, int distance);
               bool Delete (string searchKey);
               void Print();
               int Search(string searchKey);

    private:
        int count;
        Node *head;
    Node *iterator;
    Node *temp;
};

#endif

私のリスト.cpp

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

SLL::SLL():head(0){}

void SLL::Insert(string searchKey, int distance){
Node * temp = new Node(searchKey, distance);

if(head == 0){
    head = temp;
}
else{
    temp->setNext(head);
    head = temp;
}
}

bool SLL::Delete(string searchKey){
 if(head == 0){
cout << "An attempt was made to delete a node from an empty list" << endl;
 }
 else{
Node* iterator = head;
Node* last = 0;

while(iterator != 0){
   if (iterator->getKey() == searchKey){
    break;
   }
   else{
    last = iterator;
    iterator = iterator->getNext();
   }
}
if (iterator == 0){
    return false;
}
else{
    if(head == iterator){
        head = head->getNext();

    }
    else {
        last->setNext(iterator->getNext());
    }
    delete iterator;



    }

    }
 }

void SLL:: Print(){
iterator = head;
while(iterator != 0){   
    cout << iterator->getKey()  << "-" << iterator->getDistance() << endl;
    iterator = iterator->getNext();
 }

}

int SLL::Search(string searchKey){

 }

私のmain.cpp

#include "list.h"
#include "node.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    SLL * sll; 

    sll->Insert("test", 1);
    sll->Insert("test2", 2);
    sll->Delete("test");
    sll->Print();
}
4

2 に答える 2

3

ヒント: Segfault はここで発生します。

int main(int argc, char* argv[]) {
    SLL * sll; 

    sll->Insert("test", 1); // BIG segfault here.
    ...

(これは宿題のように見えるので、完全な答えはありません。)

于 2013-02-15T21:56:45.913 に答える
1

メイン関数では、へのポインターSSLは初期化されていませんが、逆参照しています。これは未定義の動作です。あなたの特定のケースでは、これがセグメンテーション違反を引き起こしています。コードを変更SSLして、スタック上でオブジェクトを作成してみてください。

int main(int argc, char* argv[]) {
    SLL sll;

    sll.Insert("test", 1);
    // ...
}

またはヒープ:

int main(int argc, char* argv[]) {
    SLL * sll = new SLL();

    sll->Insert("test", 1);
    // ...
}

ところで、クラスのtemp, iterator, ... フィールドを使用したり、初期化したりすることはありません。SLL実装では、それらを非表示にするローカル変数を定義するため、フィールドを削除するか、コンストラクターで初期化することをお勧めします。

于 2013-02-15T21:57:32.503 に答える