1

ヘッダー ファイルで宣言されたプライベート メンバー変数を持つクラスがあります。私のコンストラクターでは、いくつかのファイル名を渡し、それらの名前を使用して他のオブジェクトを作成します。これはうまくいきます。しかし、別のメンバー変数を追加してコンストラクターで初期化しようとすると、アクセス読み取り違反が発生します。コードを他の人に送信したところ、彼のコンピューターで正常に動作しました。何が間違っている可能性がありますか?

問題のあるコードは次のとおりです。

.h ファイル:

class QUERYMANAGER {
    INDEXCACHE *cache;
    URLTABLE *table;
    SNIPPET *snip;
    int* iquery[MAX_QUERY_LENGTH];
    int* metapointers[MAX_QUERY_LENGTH];
    int blockpointers[MAX_QUERY_LENGTH];
    int docpositions[MAX_QUERY_LENGTH];
    int numberdocs[MAX_QUERY_LENGTH];
    int frequencies[MAX_QUERY_LENGTH];
    int docarrays[MAX_QUERY_LENGTH][256];
    int qsize;



public:
    QUERYMANAGER();
    QUERYMANAGER(char *indexfname, char *btfname, char *urltablefname, char *snippetfname, char *snippetbtfname);
    ~QUERYMANAGER();

これは .cpp ファイルです。

#include "querymanagernew.h"
#include "snippet.h"
using namespace std;



QUERYMANAGER::QUERYMANAGER(char *indexfname, char *btfname, char *urltablefname, char *snippetfname, char *snippetbtfname){
    cache = new INDEXCACHE(indexfname, btfname);
    table = new URLTABLE(urltablefname);
    snip = new SNIPPET(snippetfname, snippetbtfname);

    //this is where the error occurs
    qsize = 0;


}

私はこれを引き起こしているものについて完全に途方に暮れています - 何かアイデアはありますか?

ありがとう、BSG

4

4 に答える 4

2

提案、配列を因数分解します:

class QUERYMANAGER
{
// Snip
    int* iquery[MAX_QUERY_LENGTH];
    int* metapointers[MAX_QUERY_LENGTH];
    int blockpointers[MAX_QUERY_LENGTH];
    int docpositions[MAX_QUERY_LENGTH];
    int numberdocs[MAX_QUERY_LENGTH];
    int frequencies[MAX_QUERY_LENGTH];
    int docarrays[MAX_QUERY_LENGTH][256];
    int qsize;
// Snip
};

別の構造が必要なようです:

struct Info
{
    int* iquery;
    int* metapointers;
    int blockpointers;
    int docpositions;
    int numberdocs;
    int frequencies;
    int docarrays[256];
};

QueryManager は次のようになります。

class QueryManager
{
    INDEXCACHE *cache;
    URLTABLE *table;
    SNIPPET *snip;
    int qsize;
    Info  details[MAX_QUERY_LENGTH];
};

これは、テーマをもう少しうまくカプセル化するのに役立つかもしれません。

于 2010-04-09T16:30:40.610 に答える
1

依存関係が正しくない可能性があり、必要なファイルが再構築されていません。「クリーン」な再構築を試みます。

スタイルの注意点として、初期化子リストを使用してください。

QUERYMANAGER::QUERYMANAGER(char *indexfname, char *btfname, char *urltablefname,
                           char *snippetfname, char *snippetbtfname) :
    cache(new INDEXCACHE(indexfname, btfname)),
    table(new URLTABLE(urltablefname)),
    snip(new SNIPPET(snippetfname, snippetbtfname)),
    qsize(0)
{
}

これらのアイテムをポインターにする必要がない場合があります。

class QUERYMANAGER {
    INDEXCACHE cache;
    URLTABLE table;
    SNIPPET snip;
...

QUERYMANAGER::QUERYMANAGER(char *indexfname, char *btfname, char *urltablefname,
                           char *snippetfname, char *snippetbtfname) :
    cache(indexfname, btfname),
    table(urltablefname),
    snip(snippetfname, snippetbtfname),
    qsize(0)
{
}
于 2010-04-09T15:55:44.197 に答える
0

予想通り、これは私のマシンでは問題なく動作します。

#include <cstdlib>

struct INDEXCACHE {};
struct URLTABLE {};
struct SNIPPET {};

const std::size_t MAX_QUERY_LENGTH = 256;

class QUERYMANAGER {
    INDEXCACHE *cache;
    URLTABLE *table;
    SNIPPET *snip;
    int* iquery[MAX_QUERY_LENGTH];
    int* metapointers[MAX_QUERY_LENGTH];
    int blockpointers[MAX_QUERY_LENGTH];
    int docpositions[MAX_QUERY_LENGTH];
    int numberdocs[MAX_QUERY_LENGTH];
    int frequencies[MAX_QUERY_LENGTH];
    int docarrays[MAX_QUERY_LENGTH][256];
    int qsize;



public:
    QUERYMANAGER(char *indexfname, char *btfname, char *urltablefname, char *snippetfname, char *snippetbtfname);
};

QUERYMANAGER::QUERYMANAGER(char *indexfname, char *btfname, char *urltablefname, char *snippetfname, char *snippetbtfname)
    : cache(new INDEXCACHE(/*indexfname, btfname*/))
    , table(new URLTABLE(/*urltablefname*/))
    , snip(new SNIPPET(/*snippetfname, snippetbtfname*/))
    , qsize(0)
{
}

int main()
{
    QUERYMANAGER foo("blargl", "frxnl", "wrgxl", "brlgl", "srgl");
    return 0;
}

したがって、エラーは表示していないコードにある必要があります。

ところで、マクロを除いて、すべて大文字の名前はbooです。彼らはあなたのコードを読みにくくし、より一般的なコーディングスタイルに慣れているすべての人を混乱させています。

于 2010-04-09T16:12:23.990 に答える
0

あなたはきれいに構築しましたか?最後のメンバー変数へのアクセスは失敗しますが、以前のメンバー変数への割り当ては正常に機能するため、インスタンスを使用するときにインスタンスを正しく構築/割り当てていないか、そうでないヘッダーの古いバージョンを参照するオブジェクト ファイルがあります。オブジェクトqsizeにはまだないため、十分なスペースが割り当てられていません。または、それらの線に沿った何か。

于 2010-04-09T15:47:59.890 に答える