我在Windows7上使用代码块创建的C++项目遇到问题。在那里,它编译得很完美,并根据需要执行程序。然而,当我尝试使用Linux Mint Cinnamon 17用Virtual Box打开它时,程序编译了,但在运行时抛出了一个分段错误(更具体地说,"分段错误过程返回139 0x8b"。我给了虚拟机2GB的RAM。这是导致程序停止的代码。
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();
}
非常感谢。
这被称为"未定义行为",当你的代码做了一些不应该做的事情时,比如从向量中读取或写入一个越界元素,写入一个缓冲区,该缓冲区不能容纳你试图写入的数据。
它可能会导致各种不可预测的后果,如分段故障、堆栈溢出、内存覆盖,甚至可能在没有意外事件的情况下完成任务。
这段特定的代码可以在许多情况下调用未定义的行为:
如果CCD_ 1小于CCD_ 2,则在计算CCD_。
如果lista[i].size()
小于lis_s+1
,它将在代码中引用lis_s
的每个地方调用未定义的行为。
如果lista[i].size()
小于1
,则其在行if(lista[i][0]=="=")
上的未定义行为。
基本上,在访问它们之前,您必须确保要访问的向量中的每个元素都存在。您可以通过检查所有大小来做到这一点,也可以确保在用信息填充这些向量时设置正确。