2015-04-03 95 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]=="=")上的未定义行为。

基本上你必须确保你想访问的那些载体中的每个元素在接触之前就存在。您可以通过检查所有尺寸来做到这一点,或者确保在向信息填充这些向量时设置正确。

相关问题