使用vector <vector <int>&gt;实例化对象时的Segfault构件</载体<int>的

时间:2015-03-30 00:20:00

标签: c++ vector segmentation-fault

Multidimensional arrays as class member with arbitrary bounds我被告知我应该使用一个向量向量的向量来表示我支持数组的图形对象中的动态二维数组。但是,每当我尝试运行代码时,我都会遇到分段错误。 GDB指向变量被定义为arraygraph类型的行;我认为这意味着我做错了指定edges的类型。这是类定义:

class arraygraph {
private:

public:
    void open(char *filename);
    bool exists(int nodeid);
    int node_count(void);
    int weight(int nodea, int nodeb);
    void print();
private:
    int count;
    vector <vector <int> > edges; //A vector of vectors! [Inception Noise]
};

定义了此对象的所有方法(有趣的是如何使用尚未填写的原型进行编译...)。代码编译时没有错误或警告。为什么会分裂?

编辑:

这是一些反汇编输出:

163       int main(int argc, char *argv[]) {
          main(int, char**):
00401c86:   lea 0x4(%esp),%ecx
00401c8a:   and $0xfffffff0,%esp
00401c8d:   pushl -0x4(%ecx)
00401c90:   push %ebp
00401c91:   mov %esp,%ebp
00401c93:   push %ebx
00401c94:   push %ecx
00401c95:   sub $0x20,%esp
00401c98:   mov %ecx,%ebx
00401c9a:   call 0x402350 <__main>
164         arraygraph thegraph;
00401c9f:   lea -0x18(%ebp),%eax  (this is where the problem occured according to GDB)
00401ca2:   mov %eax,%ecx
00401ca4:   call 0x403e90 <arraygraph::arraygraph()>

显然,段错是在arraygraph构建之前发生的?我不知道该怎么做。

编辑:

整个main()就是这样:

int main(int argc, char *argv[]) {
    arraygraph thegraph;
    thegraph.open(argv[1]);
    return 0; //Added this after I noticed I'd omitted it - didn't fix anything
}

这里是arraygraph::open()

//Only call .open() once. A second call will leave the old graph's dessicated corpse around the edges of the new one.
void arraygraph::open(char *filename){
    int count;
    int x, y;
    tomgraph loader;

    loader.open(filename);

    count=loader.node_count();

    //delete edges;
    //edges = new vector <vector <int> >;

    for (x=1; x <= count; x++) {
        for (y=1; y <= count; y++) {
            int weight;
            if (loader.is_connected(x,y,&weight) || loader.is_connected(y,x,&weight)) {
                edges[x-1][y-1]=weight;
            } else {
                edges[x-1][y-1]=0; //0 represents "no edge"
            }
        }
    }
}

但根据反汇编程序的说法,无论如何都不会被调用。

编辑:

完整代码here。嗯......我认为这说它有效吗? Lemme尝试不同的机器......

编辑:

不。在完全独立的Linux机器上编译后类似的段错误。

编辑:

为了确认,我注释了对thegraph.open()的电话。没有解决它。

1 个答案:

答案 0 :(得分:0)

您永远不会resize edgespush_back。所以它的大小是0,并且edges[x-1][y-1]你越界了。您可能必须在arraygraph::open中的循环之前执行类似的操作:

edges.resize(count, std::vector<int>(count));