Ошибка назначения динамического массива в C ++ heap [0] = heap [length-1] Error - PullRequest
1 голос
/ 11 марта 2011

Я реализую кучу minmax с c ++ в netbeans, но получаю странную ошибку.Кто-нибудь помогите, спасибо!оператор heap [0] = heap [length-1];получить ошибку сегмента, но я могу получить доступ как к элементу в 0, так и (length-1).

int MinMaxHeap::deleteMin(){
assert(length>0);
int min= heap[0];
heap[0]=heap[length-1];
length--;

int id=0,gid=4*id+3;
while(gid<length){
    int i,cmin=heap[gid],cmin_idx=gid;
    for(i=0;i<4;i++){
        if(gid>(length-1))
            break;
        if(heap[gid]<cmin){
            cmin=heap[gid];
            cmin_idx=gid;
        }
        gid++;
    }
    swap(heap[id],heap[cmin_idx]);
    id=cmin_idx;
    gid=4*id+3;
}
int sid1=2*id+1,sid2=sid1+1,cmin,cmin_idx;
if(sid1<length){
    cmin=heap[sid1];
    cmin_idx=sid1;
    if(sid2<length){
        if(heap[sid2]<heap[sid1]){
            cmin=heap[sid2];
            cmin_idx=sid2;
        }
    }
    if(heap[id]>cmin)
        swap(heap[id],heap[cmin_idx]);
}

return min;

}

объявление класса:

class MinMaxHeap {

public:

    MinMaxHeap(int size);

    virtual ~MinMaxHeap();

    int findMin();
    int findMax();
    int deleteMin();
    int deleteMax();
    bool insert(int x);
private:

    int getLevel(int i); //get the level of the ith element

    void swap(int&,int&);
    int length;  //current no. of elements of heap
    int size;    //heap size
    int *heap;   //the heap array
};

Ответы [ 2 ]

0 голосов
/ 11 марта 2011

MinMaxHeap содержит член-указатель, но не имеет конструктора копирования. Case В случае, когда необходим конструктор копирования, MinMaxHeap вызовет конструктор копирования по умолчанию, а указатель будет скопирован по значению.Когда любая из копий экземпляра была уничтожена, все копии становятся недействительными.

Некоторые примеры конструктора копирования вызываются следующим образом:

1. void fun(MinMaxHeap m); 
2. std::vector<MinMaxHeap> vecM; //containers
   vecM.push_back(MinMaxHeap(5));
3. MinMaxHeap A(5);
   MinMaxHeap aliasA = A;

Обычно вы вызываете конструктор копирования непреднамеренно.Поэтому внимательно проверьте код или реализуйте конструктор копирования и попробуйте снова.

0 голосов
/ 11 марта 2011

Вероятно, деструктор для класса вызывается за некоторое время до вызова deleteMin. Вы когда-нибудь передавали экземпляр MinMaxHeap по значению? Это вызовет деструктор, и, если вы удалите heap в деструкторе, куча будет недействительной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...