【问题标题】:c++ weird segmentation faultc++ 奇怪的分段错误
【发布时间】:2012-03-26 16:33:19
【问题描述】:
int Celda :: look(int dni)
{
    bool found = false; 
    int i = 0; int pos = -1;
    //tam_ sometimes have a strange value, but I only
    while(i < tam_ && !found){ 
        //touch tam_ in the constructor, is the size of Celda
        if(dni == bloques_[i]){    
           found = true;
            pos = i;
        }
        ++i;
    }
    return pos;
}

在 main 中,我调用了另一个类的方法,该方法调用了使用我在此处复制的外观方法的其他类。在某些情况下它可以工作,但有时程序会停止给出分段错误。

当我使用调试器时,我创建了另一个变量来存储 tam_ 值(tam_ 是 int 类型),当我到达该行或 while 循环(条件与 tam_)时,有时会出现分段错误。

Celda的构造函数是:

Celda :: Celda(int tamanio)
{
bloques_ = new int[tamanio];
bloq_ocupados_ = 0;
tam_ = tamanio;
for(int i = 0 ; i < tam_ ; ++i){
    bloques_[i] = 0;
}

}

Tabla :: Tabla(int numcel, int tambloq)
{
    nceldas_ = numcel; 
    tam_bloque_ = tambloq;
    tabla_ = new Celda*[nceldas_];
    for(int i = 0 ; i < nceldas_ ; ++i){
        tabla_[i] = new Celda(tam_bloque_);
    }
    ocupadas_ = 0;
}

class Celda
{
    private:
        int* bloques_;
        int bloq_ocupados_;
        int tam_;

公共部分

int Tabla :: busq_lineal(int dni) //si pos_dentro acaba valiendo -1, no se encontró
{
    bool encontrado = false; 
    int pos = hash(dni), comparaciones = 0, pos_dentro, pos_fuera;
    int tamaniotab = nceldas_ * tabla_[0]->gettam();
    while(!encontrado && comparaciones < tamaniotab){
        pos_dentro = tabla_[pos]->buscar(dni);
        if(pos_dentro != -1){ //si lo encuentro...
            encontrado = true;
            pos_fuera = pos;
            comparaciones += pos_dentro + 1;
        }else if(pos < nceldas_ - 1){ //mientras no nos salgamos de la tabla, avanzamos
            ++pos;
            comparaciones += tabla_[0]->gettam();
        }else {
            pos = 0; //si nos salimos, volvemos al principio
            comparaciones += tabla_[0]->gettam();
        }
    }
    return comparaciones;
}

【问题讨论】:

  • 使用英文标识符被认为是一种很好的做法。只是一个题外话。还有更多的主题:我们可以有一个测试用例吗? sscce.org
  • 你能发布Celda类的析构函数、复制构造函数和赋值运算符吗?
  • 要在条件中发生段错误,您必须有一个错误的 this 指针。您能否检查一下this 在崩溃时是否有意义?
  • 展示你的完整课程
  • @Arkadiy 你是对的,调试器告诉我关于这个指针的一些事情......解决方案是什么??

标签: c++ class segmentation-fault


【解决方案1】:

错误很可能在这一行:

int pos = hash(dni);

如您所说,您的 hash 函数只返回 dni % 199。仅当您的哈希表中至少有 200 个项目时,这才可以正常工作。

【讨论】:

    【解决方案2】:

    不应该是“i++”吗?

    for(int i = 0 ; i < tam_ ; i++){
        bloques_[i] = 0;
    }
    

    【讨论】:

    • i++ 比 ++i 慢,我使用 ++i 执行所有 for 循环以稍微提高性能
    • 前缀 vs 后缀不是这里的罪魁祸首。
    • 前缀 (++i) 和后缀 (i++) 递增运算符都递增值。前缀更有效,通常是首选。
    • 好吧,我的错,认为它会在迭代之前递增(这样循环从 1 到 size 而不是 0 到 size-1)。
    • 而且编译器的创建者都知道这一点,就像 * 和 / vs >。我们不要再去这里了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多