构造函数调用后使用 new 内部构造函数创建的变量设置为 0

问题描述

上下文

我有自己的具有减键功能的二叉堆实现。我在我的收缩层次结构实现中使用它。初始化 BinaryHeap 时,一切正常,但在构造完成后,BinaryHeap 的所有值都设置为 0(或类似 0 的值),因此堆属性不再成立。我认为这可能与 new 方法

的使用有关

错误详情

在BinaryHeap类中,保存堆信息的变量是items_,一个指向Items<payload=int,value=float>的指针向量。从具有负值和正值的成对向量(62 个元素)调用 BinaryHeap(pairs,handles) 时,items_ 在构造函数中正确设置,并且 check()(检查堆属性)运行完美。 在构造函数之外,我立即调用了 check(),但它失败了(堆属性不再有效)。所有值现在都是 0 或 0-ish (3e-41),然后比较 assert(!less(index,parent)) 失败(对于某些项目,0

我尝试过的事情:

  • 使用 gdb,我检查了二叉堆的变量,items_ 仍然是一个有 62 项的有效向量,但所有值都是 0 或 0-ish 值 (3e-41)。没有内存泄漏,但是堆的信息丢失了。
  • 如果我在隔离的测试环境中运行此二进制堆实现,则不会发生这种情况。 我不包括整个 BinaryHeap 实现,但我已经在所有基本情况下对其进行了测试,它运行良好,没有内存泄漏。
template <class Payload,class Value>
struct Item{
    Payload id;
    Value value;
    int index;
    Item(Payload id=-1,Value value=10,int index=1) : id(id),value(value),index(index) {};

};

template <class Payload,class Value>
class BinaryHeap {
public:
    BinaryHeap(){
        items_.resize(1);
        }
    // Builds a BinaryHeap from a vector of pairs
    BinaryHeap(vector<std::pair<Payload,Value>> pairs,vector<Item<Payload,Value>*>& handles)
    {
        items_.resize(pairs.size()+1);
        
        for (size_t i = 0; i < pairs.size(); i++)
        {
            items_[i+1] = new Item<Payload,Value>(pairs[i].first,pairs[i].second,i+1);
            handles[i] = items_[i+1];
        }
        for (size_t i = items_.size()/2; i > 0  ; i--)
        {
            sink_down(i);
        }
        // works fine
        check();    
    }
    
    void check() const {
        // check if heap property holds
        if (size() > 1)
        {
            for (int index = 2; index <= size(); index++) {
                int parent = parentOf(index);
                assert(!less(index,parent));
                assert(items_[index]->index == index);
            }
        }
    }
    
    int size() const {
        return items_.size()-1;
    }

    private:
        std::vector<Item<Payload,Value>*> items_;
    bool less(int i1,int i2) const {
        return items_[i1]->value < items_[i2]->value;
    }
    // Contraction hierarchies implementation,pqueue is a BinaryHeap.
    pqueue = BinaryHeap(pairs,handles_CH);
    // raises error
    pqueue.check();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)