我将问题缩小到这一行:
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
变量中的代码?