簡體   English   中英

讀取矢量時出現分段錯誤

[英]Segmentation fault when reading a vector

在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

我知道你已經接受了答案但是你發布的代碼在以下循環中有問題:

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

矢量索引從零開始。 如果向量大小為5,則有效索引為0..4。 您的代碼將嘗試訪問元素0 .. 5 ,這是一個錯誤的錯誤。 我相信你對堆棧大小的“修復”只是掩蓋了其他真正的問題。

此外,您應該通過引用而不是值傳遞向量。 當前調用AUROC(vector<float> v)時,您正在復制向量。 這是緩慢而浪費的內存浪費。 將函數更改為AUROC(vector<float> &v)

當您將您的功能稱為:

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

scores向量將被復制到堆棧中。 您不應該通過堆棧傳遞如此大的數據集合(12 MB),將代碼更改為引用或指針傳遞。

此外,您可以檢查並更改主機上的堆棧限制。 在unix上:

ulimit -s 

將打印stacklimit的當前設置。 你可以改變它

ulimit -s size_in_kb

並在更改后檢查

由於它適用於較小的尺寸,我最好的猜測是你的堆棧空間不足。 如何檢查堆棧空間並更改它取決於您的操作系統:在Linux上運行ulimit -s來檢查和ulimit -s SIZE來設置。

進一步閱讀: http//www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

我想知道你是否可能搞亂堆棧。

包裹這個

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

用花括號。

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

這個:

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

應該:

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

和其他地方類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM