【问题标题】:C++ dynamic array assignment error heap[0]=heap[length-1] ErrorC++动态数组赋值错误heap[0]=heap[length-1]错误
【发布时间】:2011-07-13 04:32:04
【问题描述】:

我在 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
};

【问题讨论】:

  • 你是new 还是malloc 堆?
  • 这可能与 heap 的初始化方式有关 - 我们可以看看你的构造函数代码吗?
  • 你在哪里分配heap
  • @Ken Wayne VanderLinde MinMaxHeap::MinMaxHeap(int size=10) { this-&gt;size=size; heap=new int[this-&gt;size]; this-&gt;length=0; }
  • 我们真的要看看你在做什么。此时长度为0。哪里有变化?

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


【解决方案1】:

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

【讨论】:

  • 不,即使我在析构函数中什么都不做,它仍然是错误的
【解决方案2】:

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;

通常,您会无意中调用复制构造函数。所以请仔细检查您的代码或实现一个复制构造函数,然后重试。

【讨论】:

  • 谢谢,netbeans 可能有问题,我在 gcc 下运行我的代码,没有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2013-12-20
  • 2010-09-07
相关资源
最近更新 更多