【问题标题】:Project runs on Windows 7 but not on Linux with Virtual Box项目在 Windows 7 上运行,但不能在带有 Virtual Box 的 Linux 上运行
【发布时间】:2015-04-03 21:51:35
【问题描述】:

我在使用代码块在 Windows 7 上创建的 C++ 项目时遇到问题。它在那里完美编译并根据需要执行程序但是当我尝试使用 Linux Mint Cinnamon 17 使用 Virtual Box 打开它时,程序编译但在运行时抛出分段错误错误(更具体地说,“分段错误过程返回 139 0x8b”。我给了虚拟机 2 GB 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();
}

非常感谢。

【问题讨论】:

  • 调试器在这种情况下很有帮助。
  • 在访问lista[i][...]之前确保lista[i].size() &gt; 0
  • 嗨@Havenard它是一个包含整数的向量,表示在lista的每个子向量上找到的字符串的最大大小,因为它是向量的向量。

标签: c++ linux segmentation-fault linux-mint


【解决方案1】:

这被称为“未定义的行为”,当您的代码执行不应该执行的操作时,例如从向量中读取或写入越界元素,写入无法容纳与您一样多的数据的缓冲区试图写入它等等。

它可能会导致各种不可预知的后果,如分段错误、堆栈溢出、内存覆盖,甚至可能在没有明显事件的情况下完成任务。

这段特定的代码可以在多种情况下调用未定义的行为:

如果maximos.size() 小于lista.size(),则其在计算espacios 时的行为未定义。

如果lista[i].size() 小于lis_s+1,它将在代码的每个引用lis_s 的地方调用未定义的行为。

如果lista[i].size() 小于1,它在if(lista[i][0]=="=") 行上的未定义行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多