默认构造函数的分段错误;矢量未正确初始化

时间:2012-11-24 20:36:00

标签: c++

当我在int main()中调用默认构造函数Heap()时,我感觉我没有正确初始化向量指针给我一个分段错误。我不确定如何解决这个问题。下面是一个示例代码,其中包含我遇到问题的区域的注释(使用segmentation faultsvector添加元素时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;

}

2 个答案:

答案 0 :(得分:0)

h2.ptr为NULL,这就是你得到段错误的原因。

答案 1 :(得分:0)

我猜你的默认构造函数应该是这样的:

Heap() : ptr(new std::vector<A> ()) {}

在您当前的变体中,您的ptr初始化为一些未定义的值(NULL或者某些垃圾)。它应该用实际向量的指针初始化。