使用类成员变量时访问读取错误

时间:2010-04-09 15:44:22

标签: c++ header-files access-violation member-variables

我有一个在头文件中声明私有成员变量的类。在我的构造函数中,我传入一些文件名并使用这些名称创建其他对象。这很好用。但是,当我尝试添加另一个成员变量并在构造函数中初始化它时,我得到访问读取违规。我将代码发送给其他人,并且在他的计算机上运行正常。知道什么可能是错的吗?

以下是有问题的代码:

.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 个答案:

答案 0 :(得分: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];
};

这可能有助于更好地封装主题。

答案 1 :(得分: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)
{
}

答案 2 :(得分:0)

你建造干净吗?由于访问最后一个成员变量会爆炸,但是分配给早期的成员变量可以正常工作,或者你在使用它时没有正确构造/分配实例,或者你有对象文件引用了那些没有的标题的旧版本在对象中有qsize,因此没有分配足够的空间。或者沿着这些方向发展。

答案 3 :(得分: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;
}

因此错误必须在您未显示的代码中。

BTW,除了宏之外,所有大写的名字都是boo。它们使您的代码更难以阅读,并使所有人习惯于更常见的编码风格。