当我在int main()中调用默认构造函数Heap()时,我感觉我没有正确初始化向量指针给我一个分段错误。我不确定如何解决这个问题。下面是一个示例代码,其中包含我遇到问题的区域的注释(使用segmentation faults
向vector
添加元素时push_back
。
#include <vector>
#include <iostream>
struct A
{
A(int av, int bv):a(av),b(bv){}
int a, b;
};
struct Heap
{
Heap() : ptr() {}
Heap(std::vector<A> *p) : ptr(p) {}
void makeHeap()
{
heapLoc.push_back(0);
if(ptr->size()==1){
return;
}
for(int i=1; i<ptr->size(); ++i){
heapLoc.push_back(i);
filterUp(i);
}
}
void filterUp(int idx)
{
int parent;
parent = (idx-1)/2;
while((*ptr)[heapLoc[parent]].b > (*ptr)[heapLoc[idx]].b){
std::swap(heapLoc[parent],heapLoc[idx]);
idx=parent;
parent=(parent-1)/2;
}
}
void pushHeap(A newA)
{
int idx;
ptr->push_back(newA); //SEGMENTATION FAULT caused by this line when calling h2.pushback(a8)
idx=ptr->size()-1;
heapLoc.push_back(idx);
filterUp(idx);
}
std::vector<A> *ptr;
std::vector<int> heapLoc;
};
int main()
{
A a0(2,5), a1(4,2), a2(8,4), a3(0,3), a4(2,1),a5(2,7);
std::vector<A> aArray;
aArray.push_back(a0);
aArray.push_back(a1);
aArray.push_back(a2);
aArray.push_back(a3);
aArray.push_back(a4);
aArray.push_back(a5);
Heap h(&aArray);
h.makeHeap();
A a8(99,1);
h.pushHeap(a8); //works fine
Heap h2();
h2.pushHeap(a8); //SEGMENTATION FAULT
return 0;
}
答案 0 :(得分:0)
h2.ptr
为NULL,这就是你得到段错误的原因。
答案 1 :(得分:0)
我猜你的默认构造函数应该是这样的:
Heap() : ptr(new std::vector<A> ()) {}
在您当前的变体中,您的ptr初始化为一些未定义的值(NULL或者某些垃圾)。它应该用实际向量的指针初始化。