2013-08-01 63 views
2

我在代碼期間出現分段錯誤,我想知道爲什麼。我正在猜測它與vector.erase()函數之間的關係。在向量中使用擦除的C++分段錯誤

#include <iostream> 
#include <vector> 
#include <math.h> 

long long gcd(long long x, long long y); 
std::vector<long long> factor(long long x); 
typedef std::vector<long long> vectorNum; 

int main(int argc, const char * argv[]) 
{ 

    // insert code here... 
    long long unFriendly; 
    long long friendly; 
    long long counter = 0; 
    std::cin >> unFriendly; 
    std::cin >> friendly; 
    vectorNum n; 
    n = factor(friendly); 

    for(long long x = 0;x < unFriendly;x++){ 
     long long num = 0; 

     std::cin >> num; 
     counter = gcd(friendly, num); 
     for(long long y = n.size() - 1;y >= 0;y--){ 
      vectorNum temp(n); 
      if(counter % n.at(y) == 0){ 
       n.erase(n.begin() + y); 
      } 
     } 
    } 

    std::cout<<n.size(); 
    n.clear(); 

} 

long long gcd(long long x, long long y){ 
    while(y != 0){ 
     long long a = x % y; 
     x = y; 
     y = a; 
    } 
    return x; 
} 

std::vector<long long> factor(long long x){ 
    long long y; 
    long long root = sqrt(x); 
    std::vector<long long> vectorSet; 
    for(y = 2; y <= root;y++){ 
     if(x % y == 0){ 
      vectorSet.push_back(y); 
      vectorSet.push_back(x/y); 

     } 
    } 
    vectorSet.push_back(x); 
    return vectorSet; 
} 

任何一種洞察力都是完美的!提前致謝。 這是被調用的兩個函數。根據要求,gcd()factors()功能。

+1

哪裏有gcd和factor的實現 – aaronman

+0

帶有erase()的for()循環看起來有點奇怪,你爲什麼要把整個向量複製到一個棧?在擦除之後,y可能會超出範圍,從而導致您觀察到的崩潰。 – Karadur

+0

如果'n'爲空,則'y'超出範圍。你在調試器下運行嗎?我問,因爲它花了我不到一分鐘在Visual Studio調試器下運行,看看這段代碼拋出'std :: out_of_range'。 – Joel

回答

2
for(long long x = 0;x < unFriendly;x++){ 
    long long num = 0; 

    std::cin >> num; 
    counter = gcd(friendly, num); 
    for(long long y = n.size() - 1;y >= 0;y--) { // <-- n.size() == 0, 0U - 1 is huge 
     vectorNum temp(n); 
     if(counter % n.at(y) == 0){ // <-- y is huge, throws std::out_of_range 
      n.erase(n.begin() + y); 
     } 
    } 
} 

我強烈建議在調試器下運行您的代碼。很快運行代碼時Visual Studio調試器顯示此:

enter image description here

0

你的程序會崩潰,如果friendly是0。這是因爲factor功能將推0到返回向量。在最內層循環中,訪問n.at(y)將給出值0並將counter除以0會生成一個異常,以便對應用程序進行段錯誤處理。