SIGSEGV的原因可能是系统的低ram吗?

Bas*_*lis 2 c++ ram segmentation-fault

我的系统内存很小,1.5GB.我有一个C++程序,调用特定方法大约300次.这个方法使用2个映射(每次都清除它们),我想知道在这个方法的某些调用中是否有可能堆栈溢出而程序失败.如果我输入小数据(因此方法被调用30次),程序运行正常.但现在它引发了SIGSEGV错误.我试图解决这个问题大约3天没有运气,我试过的每个解决方案都失败了.

我在下面找到了SIGSEGV的一些原因,但没有任何帮助 C++中的SIGSEGV运行时错误是什么?

好的,这是代码.我有2个实例,其中包含一些关键字功能及其分数

我想获得他们的eucleidian距离,这意味着我必须保存每个实例的所有关键字,然后找到第一个关键字与第二个关键字的差异,然后找到剩下的第二个的差异实例.我想要的是在迭代第一个地图时,能够从第二个地图中删除元素.由于我们有两个消息集合,因此多次调用以下方法,并且将来自第一个消息集合的每个消息与来自第二个消息集合的每个消息进行比较.

我有这个代码,但它突然停止,虽然我检查它工作了几秒钟与多个cout我放在一些地方

请注意,这是针对大学的任务,所以我不能使用提升和所有这些技巧.但我想知道如何绕过我遇到的问题.

float KNNClassifier::distance(const Instance& inst1, const Instance& inst2) {   
map<string,unsigned> feat1;
map<string,unsigned> feat2;
for (unsigned i=0; i<inst1.getNumberOfFeatures(); i++) {
  feat1[inst1.getFeature(i)]=i;
}
for (unsigned i=0; i<inst2.getNumberOfFeatures(); i++) {
  feat2[inst2.getFeature(i)]=i;
}
float dist=0;

map<string,unsigned>::iterator it;
for (it=feat1.begin(); it!=feat1.end(); it++) {
  if (feat2.find(it->first)!=feat2.end()) {//if and only if it exists in inst2
    dist+=pow( (double) inst1.getScore(it->second) - inst2.getScore(feat2[it->first]) , 2.0);
    feat2.erase(it->first);
  }
  else {
    dist+=pow( (double) inst1.getScore(it->second) , 2.0);
  }
}

for (it=feat2.begin(); it!=feat2.end(); it++) {//for the remaining words
  dist+=pow( (double) inst2.getScore(it->second) , 2.0);
}
feat1.clear(); feat2.clear(); //ka8arizoume ta map gia thn epomenh xrhsh
return sqrt(dist);    
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个想法,以便不必删除某些内容,但它也会突然停止.

float KNNClassifier::distance(const Instance& inst1, const Instance& inst2) {
map<string,unsigned> feat1;
map<string,unsigned> feat2;
map<string,bool> exists;
for (unsigned i=0; i<inst1.getNumberOfFeatures(); i++) {
  feat1[inst1.getFeature(i)]=i;
}
for (unsigned i=0; i<inst2.getNumberOfFeatures(); i++) {
  feat2[inst2.getFeature(i)]=i;
  exists[inst2.getFeature(i)]=false;
  if (feat1.find(inst2.getFeature(i))!=feat1.end()) {
    exists[inst2.getFeature(i)]=true;
  }
}
float dist=0;
map<string,unsigned>::iterator it;
for (it=feat1.begin(); it!=feat1.end(); it++) {
  if (feat2.find(it->first)!=feat2.end()) {
    dist+=pow( (double) inst1.getScore(it->second) - inst2.getScore(feat2[it->first]) ,      2.0);
  }
  else {
    dist+=pow( (double) inst1.getScore(it->second) , 2.0);
  }
}

for (it=feat2.begin(); it!=feat2.end(); it++) {
  if(it->second==false){//if it is true, it means the diff was done in the previous iteration
    dist+=pow( (double) inst2.getScore(it->second) , 2.0);
  }
}

feat1.clear(); feat2.clear(); exists.clear();
return sqrt(dist);
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 6

如果malloc失败并因此返回NULL它确实会导致SIGSEGV,假设程序没有正确处理该失败.但是,如果内存很低,你的系统很可能会开始使用大量内存来杀死进程(如果你感兴趣的话,实际逻辑会更复杂,google会为"oom killer").

很可能你的程序中只有一个错误.解决这个问题的一个好方法是使用内存调试器,例如valgrind查看是否访问无效的内存位置.