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

你建的干净吗?由于访问最后一个成员变量会爆炸,但分配给较早的成员变量可以正常工作,要么您在使用它时没有正确构造/分配实例,要么您有引用旧版本的标头的目标文件没有'对象qsize中还没有,因此没有分配足够的空间。或类似的规定。

于 2010-04-09T15:47:59.890 回答
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 回答