该项目在Windows7上运行,但不在带有虚拟盒子的Linux上运行



我在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]=="=")上的未定义行为。

基本上,在访问它们之前,您必须确保要访问的向量中的每个元素都存在。您可以通过检查所有大小来做到这一点,也可以确保在用信息填充这些向量时设置正确。

最新更新