2

私は周りを見回してすべての解決策を試しましたが、問題を解決できないようです。push_front行でセグメンテーション違反が発生することはわかっていますが、迷子になっています。これがコードです-

#include <iostream>
#include <fstream>
#include <sstream>
#include <list>

using namespace std;

typedef std::list<int> hSlots; //the list
typedef hSlots* hTable; //an array of lists

class HashTable
{
private:
int p; //p=number of slots in the hash table
hTable tmpPtr;
hTable *table;

 public:
HashTable(int p1);
int h1(int k);
~HashTable();

void chainedHashInsert(int x);

};

 HashTable::HashTable(int p1)
 {
p=p1;
hTable tTable[p];

//initializing to empty lists
for (int i=0; i<p; i++)
{
    tmpPtr = new hSlots;
    tTable[i] = tmpPtr;
}

table = tTable;
}

//destrcutor
HashTable::~HashTable()
{
delete table;
delete tmpPtr;
}

void HashTable::chainedHashInsert(int x)
{
tmpPtr = table[h1(x)];
cout<<"hashed"<<endl;
tmpPtr->push_front(x); //segmentation fault
}

int HashTable::h1(int k)
{
    int z = k%p;
    return z;
}

あまりリストを使ったことがないのでよくわかりません

4

3 に答える 3

2

結局、これは適切な答えかもしれません。

問題は、C ++でメモリ管理(間違った)を手動で行うことから発生しますが、実際には必要ありません。

これが、C++での直接自動メモリ管理を使用した私の見解です。

#include <vector>
#include <list>

using namespace std;

template <typename T, typename hSlots = std::list<T> >
class HashTable
{
private:
    int p; //p=number of slots in the hash table
    std::vector<hSlots> table;
    int getbucket(int k) { return k%p; }

public:
    HashTable(int p1) : p(p1), table(p1) {}

    void chainedHashInsert(int x)
    {
        auto& tmpPtr = table[getbucket(x)];
        tmpPtr.push_front(x);
    }
};

int main()
{
    HashTable<int> table(37);
}
于 2013-03-03T02:01:21.260 に答える
0

tTableローカル変数であるため、メソッドが戻ってダングリングポインタとして離れるHashTableと消えます。したがって、それを取り除くには、以下のようにします。を使用してテーブル用のスペースを作成します。HashTabletablenew

HashTable::HashTable(int p1)
 {
p=p1;
table  = new ttTable[p];

//initializing to empty lists
for (int i=0; i<p; i++)
{
    tmpPtr = new hSlots;
    table[i] = tmpPtr;
}
}
于 2013-03-03T01:47:53.340 に答える
0
table = tTable;

この行が問題です(または少なくとも1つ)。

自動オブジェクトへのポインタをメンバー変数に隠し、オブジェクトが破棄されたら、後でそれを逆参照(および削除!)します。

于 2013-03-03T01:48:58.317 に答える