我将问题缩小到这一行:

    indg = nets[i]->adjlist[i].size();   // indg is in a method of the Ensemble class

上述变量在哪里
    vector<DDNetwork*> nets;    // this vector is in the Ensemble class

    int indg;

    class DDNetwork
    {
        friend class Ensemble;
        ...
        public:
            vector< vector<int> > adjlist;  // the adjacency list of the network
        ...
    };

我不明白indg = nets[i]->adjlist[i].size();为什么会导致段错误,我缺少什么吗?另外,如果您需要更多信息,我可以添加它。

编辑:我刚刚意识到出了什么问题,我对adjlist使用的索引与对nets使用的索引相同,
    indg = nets[i]->adjlist[i].size();

应该:
    indg = nets[i]->adjlist[j].size();

编辑:逐步调试之后,我注意到在Ensemble的构造函数中,nets.size() = 10(预期),但是当调用Ensemble::alloc_dev_memory方法时,nets.size() = 803384(意外),因此我认为JaredPar的第二个建议可能可以解释这个问题。以下是将DDNetwork *实例添加到nets变量中的代码:
    Ensemble::Ensemble(int N, float K, int S, bool seedrand, int ltype, int numNets)
    {
        this->N = N;
        this->K = K;
        this->S = S;
        this->ltype = ltype;
        this->numNets = numNets;

        if(seedrand)
            srand(time(0));

        nets.resize(numNets);    // make a vector of pointers to DDNetwork
        for(int i=0; i < numNets; ++i)
            nets[i] = new DDNetwork(N,K,S,seedrand,ltype);

        // pre-compute the S^k for k=0,1,...,Kmax
        Spow[0]=1;                  // S^0 = 1
        int k=1;
        while(k <= Kmax*2) {
            Spow[k] = S*Spow[k-1];  // S^k = S*(S^(k-1))
            ++k;
        }
    }

当我在main函数中实例化ensemble变量时,将调用此构造函数:
    // instantiate ensemble of networks
    Ensemble ens(N, K, S, seed_rand, multiedge, numNets);
    // run_the ensemble one time step
    ens.run_gpu();

然后,Ensemble::run_gpu调用Ensemble::alloc_dev_memory,然后在调用nets[i]->adjlist[j].size()时,这就是我收到分段错误的时间。
nets引用如何未初始化?

最佳答案

该问题可能是以下之一

  • 在访问成员时,DDNetwork*中的nets[i]引用未初始化,从而导致段错误。
  • nets的大小和adjlist的每个实例未保持同步,导致其中一个偏移量无效

  • 您能否发布将DDNetwork*实例添加到nets变量中的代码?

    09-05 22:47