C ++动态数组赋值错误堆[0] =堆[length-1]错误

时间:2011-03-11 01:37:38

标签: arrays netbeans dynamic segmentation-fault variable-assignment

我在netbeans中使用c ++实现了一个minmax堆,但是我得到了一个奇怪的错误。有人帮忙,谢谢! 语句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 :(得分:0)

在调用deleteMin之前的某个时间,可能会调用该类的析构函数。你有没有按价值传递MinMaxHeap的实例?这将触发析构函数,并假设您在析构函数中删除heap,堆将无效。

答案 1 :(得分:0)

MinMaxHeap包含指针成员,但没有复制构造函数。 如果需要复制构造函数,MinMaxHeap将调用默认复制构造函数,并且指针值被复制。当任何一个实例的副本被销毁时,所有副本都将失效。

复制构造函数的一些示例调用如下:

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

通常,您无意中调用了复制构造函数。因此,请仔细检查您的代码或实现复制构造函数,然后重试。