读取矢量时出现分段错误

时间:2010-12-17 22:52:05

标签: c++ stl

在c ++程序中,当我想读取大小为2697806的向量时,我总是得到Segmentation fault错误。 我已经尝试了所有可能的阅读方法:

void AUROC(vector<float> v) {
   ...
   for(std::vector<int>::size_type i = 0; i != v.size(); i++)
      if (v[i]>0) ++pos; else ++neg;

   for(std::vector<long>::size_type i = 0; i != v.size(); i++)
     if (v[i]>0) ++pos; else ++neg;

   for (vector<float>::iterator i=v.begin(); i!=v.end(); ++i)
     if (*i>0) ++pos; else ++neg;

   for (long i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;

   for(int i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;
}

...
int main(void) { 
    vector<float> scores;
    // put data in scores;
    AUROC(scores);
}

这个问题永远不会发生在尺寸小得多的矢量上。

感谢您的帮助。 最好, Pegah

5 个答案:

答案 0 :(得分:3)

我知道您已经接受了答案但是您发布的代码在以下循环中存在问题:

for(int i=0;i<=v.size();i++)

矢量索引从零开始。如果向量大小为5,则有效索引为0..4。您的代码将尝试访问元素0 .. 5 ,这是一个错误的错误。我相信你对堆栈大小的“修复”只是掩盖了其他真正的问题。

此外,您应该通过引用而不是值传递向量。您正在呼叫AUROC(vector<float> v)时正在复制向量。这是缓慢而浪费的内存浪费。将功能更改为AUROC(vector<float> &v)

答案 1 :(得分:2)

当您将您的功能称为:

vector<float> scores;
// put data in scores;
AUROC(scores);

scores向量将被复制到堆栈中。您不应该通过堆栈传递如此大的数据集合(12 MB),将代码更改为引用或指针传递。

此外,您可以检查并更改主机上的堆栈限制。在unix上:

ulimit -s 

将打印stacklimit的当前设置。您可以通过

进行更改
ulimit -s size_in_kb

并在更改后检查

答案 2 :(得分:1)

由于它适用于较小的尺寸,我最好的猜测是你的堆栈空间不足。如何检查堆栈空间并更改它取决于您的操作系统:在Linux上运行ulimit -s以检查并ulimit -s SIZE进行设置。

进一步阅读:http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

答案 3 :(得分:0)

我想知道你是不是在搞乱堆栈。

包裹这个

if (v[i]>0) ++pos; else ++neg;

用花括号。

{ if (v[i]>0) ++pos; else ++neg; }

答案 4 :(得分:0)

此:

for (long i=0;i<=v.size;i++)

应该是:

for (long i=0;i<=v.size();i++)

和其他地方类似。