【发布时间】:2011-08-29 18:49:18
【问题描述】:
我已将问题缩小到这一行:
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 函数中实例化集成变量时,会调用此构造函数:
// 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 引用如何未初始化?
【问题讨论】:
-
添加adjlist的初始化代码。
-
也许您的
i超出了向量的范围? -
nets[i]超出范围,或者nets[i]->adjlist[i]超出范围。 -
就在线路崩溃之前,您可以使用
assert(i<nets.size()); assert(i<nets[i]->adjlist.size());找出它是否是这两者之一。 -
投票关闭为“过于本地化”: OP 解决了他的问题;他们没有将其作为自己的答案提交;问题归结为一个拼写错误,不太可能帮助解决任何一般问题。
标签: c++ stl vector segmentation-fault