在 C++ 程序中,当我想读取大小为 2697806 的 vector 时,总是会出现 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);
}
这个问题永远不会发生在尺寸小得多的 vector 上。
感谢您的帮助。 最好, 佩嘉
最佳答案
我知道您已经接受了答案,但是您发布的代码在以下循环中存在问题:
for(int i=0;i<=v.size();i++)
vector 索引是从零开始的。如果 vector 大小为 5,则有效索引为 0..4。您的代码将尝试访问元素 0..5,这是一个差一错误。我相信您对堆栈大小的“修复”只是掩盖了其他实际问题。
此外,您应该按引用而不是按值传递 vector 。当您调用 AUROC(vector<float> v)
时,您当前正在复制 vector .这很慢,而且是对内存的极大浪费。将函数改为AUROC(vector<float> &v)
.
关于c++ - 读取 vector 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475448/