Я сузил задачу до этой строки:
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();
может привести к segfault, я что-то упускаю? Также, если вам нужна дополнительная информация, я могу ее добавить.
РЕДАКТИРОВАТЬ: Я только что понял, что было не так , я использую тот же индекс для 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;
}
}
Этот конструктор вызывается, когда я создаю экземпляр переменной ensemble в моей main
функции:
// 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
будет инициализирована?