我在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
};
答案 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;
通常,您无意中调用了复制构造函数。因此,请仔细检查您的代码或实现复制构造函数,然后重试。