C++ 在构造函数调用后,使用新的内部构造函数创建的变量被设置为0 上下文

C++ 在构造函数调用后,使用新的内部构造函数创建的变量被设置为0 上下文,c++,constructor,scope,new-operator,binary-heap,C++,Constructor,Scope,New Operator,Binary Heap,我有自己的二进制堆实现,具有减少密钥功能。我正在我的收缩层次结构实现中使用它。初始化BinaryHeap时,所有工作正常,但在构造完成后,BinaryHeap的所有值都设置为0(或类似于0的值),因此heap属性不再有效。我认为这可能与new方法的使用有关 错误的详细信息 在BinaryHeap类中,保存堆信息的变量是项,它是指向项的指针向量。当从具有负值和正值的对向量(62个元素)调用二进制堆(pairs,handles)时,项在构造函数中正确设置,并且检查()(检查堆属性)运行良好在构造函数

我有自己的二进制堆实现,具有减少密钥功能。我正在我的收缩层次结构实现中使用它。初始化BinaryHeap时,所有工作正常,但在构造完成后,BinaryHeap的所有值都设置为0(或类似于0的值),因此heap属性不再有效。我认为这可能与
new
方法的使用有关

错误的详细信息 在BinaryHeap类中,保存堆信息的变量是
,它是指向
的指针向量。当从具有负值和正值的对向量(62个元素)调用
二进制堆(pairs,handles)
时,
项在构造函数中正确设置,并且
检查()
(检查堆属性)运行良好在构造函数之外,我立即调用了
check()
,它失败了(heap属性不再有效)
。所有值现在都是0或0-ish(3e-41),然后比较
assert(!less(index,parent))
失败(对于某些项,0<3e-41)。向量项仍然是大小62

我尝试过的事情:
  • 使用gdb,我检查了二进制堆的变量,items_u.仍然是一个包含62项的有效向量,但是所有值都是0或0-ish值(3e-41)。没有内存泄漏,但堆的信息丢失
  • 如果我在一个独立的测试环境中运行这个二进制堆实现,就不会发生这种情况。 我没有包括整个BinaryHeap实现,但我已经在所有基本情况下对其进行了测试,它工作正常,没有内存泄漏
模板
结构项{
有效载荷id;
价值观;
整数指数;
项目(有效负载id=-1,值Value=10,int-index=1):id(id),值(Value),索引(index){};
};
模板
类二进制堆{
公众:
二进制堆(){
调整项目大小(1);
}
//从对向量构建二进制堆
二进制堆(向量对、向量和句柄)
{
项目大小(pairs.size()+1);
对于(size_t i=0;i0;i--)
{
下沉(i);
}
//很好
检查();
}
无效检查()常量{
//检查heap属性是否有效
如果(大小()>1)
{
for(int-index=2;index=index);
}
}
}
int size()常量{
返回项目大小()-1;
}
私人:
std::向量项;
无布尔(整数i1,整数i2)常数{
返回项目\uI1]->valuevalue;
}

我们能找一辆吗?另外,在
check
中,看起来您使用
i==size()
访问出界,第二个
断言是赋值,而不是比较。堆的大小是向量的大小减去1,因此size()不是出界(我包括它)。关于第二个断言,您是对的,我已经修复了它,但它不会引起任何错误。我需要一些时间来得到一个最小的例子。。。。整个事情都泄露了记忆。有证据表明,基于1的数组索引是强制的,结果总是以眼泪告终。这整件事需要重新设计。从“特别是,有时为了简化算术,将根放在索引1处。”到现在仍然缺乏这一点。不显示析构函数或赋值运算符。在自由和/或双重删除后,可能会使用这些组合。
    // Contraction hierarchies implementation, pqueue is a BinaryHeap.
    pqueue = BinaryHeap(pairs, handles_CH);
    // raises error
    pqueue.check();