2015-04-03 119 views
-1

我在使用代碼塊在Windows 7上創建C++項目時遇到了問題。在那裏,它編譯完美,並執行程序所需但是當我試圖用VirtualBox打開它使用Linux Mint Cinnamon 17程序編譯但在運行時拋出一個分段錯誤錯誤(更具體地說「分段錯誤過程返回139 0x8b」。虛擬機2 GB的RAM。這裏是導致程序停止代碼。項目在Windows 7上運行,但不在虛擬框的Linux上運行

string Tabla::linea(contenedor& lista, int lis_s) 
{  //contenedor is: vector < vector <string> > 
    ostringstream os; 
    os<<"|"; 
    for(int i=0; i< lista.size();i++) 
    { int espacios =maximos[i]-lista[i][lis_s].size(); 
     if(lista[i][0]=="<") 
     { 
      os<<" "<<lista[i][lis_s]<<string(espacios,' ')<<" "; 
     } 
     if(lista[i][0]==">") 
     { 
      os<<" "<<string(espacios,' ')<<lista[i][lis_s]<<" "; 
     } 
     if(lista[i][0]=="=") 
     { 
      os<<" "<<string(espacios/2,' ')<< 
       lista[i][lis_s]<<string(espacios/2,' ')<<" "; 

      if(espacios%2==1) 
       os << " "; 
     } 


     os<<"|"; 
    } 

    return os.str(); 
} 

非常感謝你。

+1

什麼是'maximos'? – Havenard 2015-04-03 21:59:09

+1

調試器在這種情況下很有用。 – 2015-04-03 21:59:37

+1

在訪問lista [i] [...]'之前,確保'lista [i] .size()> 0'。 – 2015-04-03 22:06:08

回答

1

這就是所謂的「不確定的行爲」,當你的代碼做了它它不應該這樣做,就像從一個向量中讀取或寫入一個出界元素,寫入一個緩衝區,該緩衝區不能容納儘可能多的數據,因爲您試圖向其寫入數據等。

這可能會導致各種不可預知的後果,如分段錯誤,堆棧溢出,內存覆蓋,甚至可能完成其任務而無需發生事件。

此特定的碼片可以用多種情況下可以調用未定義的行爲:

如果maximos.size()是計算espacios當小於lista.size()其未定義的行爲。

如果lista[i].size()小於lis_s+1它會在您的代碼的每個地方調用未定義的行爲來引用lis_s

如果lista[i].size()小於1其行if(lista[i][0]=="=")上的未定義行爲。

基本上你必須確保你想訪問的那些載體中的每個元素在接觸之前就存在。您可以通過檢查所有尺寸來做到這一點,或者確保在向信息填充這些向量時設置正確。

相關問題