Доступ к ошибке чтения при использовании переменной класса - PullRequest
1 голос
/ 09 апреля 2010

У меня есть класс с закрытыми переменными-членами, объявленными в заголовочном файле. В моем конструкторе я передаю некоторые имена файлов и создаю другие объекты, используя эти имена. Это отлично работает. Однако, когда я пытаюсь добавить другую переменную-член и инициализировать ее в конструкторе, я получаю нарушение чтения прав доступа. Я отправил код кому-то другому, и он отлично работает на его компьютере. Есть идеи, что может быть не так?

Вот код нарушения:

Файл .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 ]

2 голосов
/ 09 апреля 2010

Предложение, исключить массивы:

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];
};

Это может помочь лучше инкапсулировать темы.

1 голос
/ 09 апреля 2010

Ваши зависимости, вероятно, неверны, а необходимые файлы не восстанавливаются. Попробуйте "чистую" перестройку.

В качестве примечания к стилю используйте списки инициализаторов.

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)
{
}
0 голосов
/ 09 апреля 2010

Как и ожидалось, на моей машине все работает отлично:

#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, кроме макросов. Они усложняют чтение вашего кода и вводят всех в заблуждение более распространенным стилем кодирования.

0 голосов
/ 09 апреля 2010

Вы построили чистый? Поскольку доступ к последней переменной-члену разрушается, но назначение более ранних работает нормально, либо вы не создаете / не выделяете экземпляр правильно, когда вы его используете, либо у вас есть объектные файлы, которые ссылаются на более старые версии заголовка, который В объекте еще нет qsize, и, следовательно, недостаточно места. Или что-то в этом роде.

...