2014-08-29 3 views
0

Heap 데이터 유형을 구현하려고 시도했지만 벽에 부딪 혔습니다. 이전 답변의 많은 moar 코드를 요구하기 때문에벡터의 크기를 얻으려고 시도하면 segfault가 발생합니다.

는 여기있다 :

#include <iostream> 
#include <vector> 
#include <iomanip> 

using namespace std; 

template <typename T> void display_array(vector<T> arr, bool endline = true) 
{ 
    cout << arr.size() << endl; 
    for (int i = 0; i < arr.size() - 1; i++) cout << arr[i] << ", "; 
    cout << arr[arr.size() - 1]; 
    if(endline) cout << endl; 
} 

template <class T> class Heap 
{ 
    //typedef T Node; 
// setw(...); 
//private: 

public: 
    vector<T>* elems; 
    Heap() : elems(nullptr) 
    { 
     this->elems = new vector<T>; 
    } 

    Heap(vector<T> e) 
    { 
     this->elems = new vector<T>(e); 
    } 

    Heap(vector<T>* e) 
    { 
     this->elems = e; 
    } 

    Heap(Heap<T>& h) 
    { 
     this->elems = new vector<T>(h.elems); 
    } 

    ~Heap() 
    { 
     delete elems; 
    } 

    T elemAt (int index) 
    { 
     return (*(this->getElems())) [index]; 
    } 

    vector<T>* getElems() 
    { 
     return this->elems; 
    } 

    int parent (int index) 
    { 
     return index/2; 
    } 

    long getSize() 
    { 
     return this->getElems()->size(); 
    } 

    int left (int index) 
    { 
     return 2 * index; 
    } 
    T leftElem (int index) 
    { 
     return this->elems [2 * index]; 
    } 

    int right (int index) 
    { 
     return 1 + 2 * index; 
    } 
    T rightElem (int index) 
    { 
     return this->elems [1 + 2 * index]; 
    } 

    bool withinHeap (int index) 
    { 
     return index <= (this->getSize()); 
    } 

    void maxHeapify(int index) 
    { 
     int largest = index; 
     int l = left(index); 
     int r = right(index); 

     if (withinHeap(l) && elemAt(l) > elemAt(index)) 
     { 
      if (withinHeap(r) && elemAt(r) > elemAt(l)) 
      { 
       largest = r; 
      } 
      largest = l; 
     } 

     if (largest != index) 
     { 
      int temp = elemAt(index); 
      elemAt(index) = elemAt(largest); 
      elemAt(largest) = temp; 
      delete temp; 
     } 
     /* or return withinHeap(l) && elemAt(l) > elemAt(index) ? withinHeap(r) && elemAt(r) > elemAt(l) ? r : l : index; :) */ 
    } 

    void display(int current, int indent) 
    { 
     if(withinHeap(left(current))) display(left(current), indent + 4); 
     if (indent > 0) cout << setw(indent) << " "; 
     cout << elemAt(current) << endl; 
     if(withinHeap(right(current))) display(right(current), indent + 4); 
    } 
}; 

int main() 
{ 
    vector<int> vec {2, 5, 4, 12, 3, 9}; 
    Heap<int>* h = new Heap<int>(vec); 
    display_array(*h->getElems()); 

    h->display(0, 0); 


    return 0; 
} 

이 마지막 문 (h->display(0,0))이 세그먼트 폴트가 발생합니다. 나는 getSize() 함수로 그것을 좁혔다. GDB에서

, print this.elemsprint *this.elems (그들은 객체 추적을 반환하거나라고하든) 괜찮아,하지만 난 입력 할 때 print *this.elems->size() GDB는 정말이야

Cannot access memory at address 0xbf7fffef

로 응답 새로운 C++ 및 gdb 및 모든 것. 여기 뭐가 잘못 됐니?

+0

FYI에서 'Heap' 클래스는 3 행의 main() 프로그램으로 깨질 수 있습니다. 사용자 정의 할당 연산자가 없기 때문에 모두. – PaulMcKenzie

+0

'vector'에 대한 포인터가 정말로 필요하거나 원하지 않습니다. –

+0

문제는 귀하의 알고리즘 내에있는 getSize() 함수와 관련이 없습니다. 나는 getSize() 내부에 cout 문을 넣었고 터미널은 스팸 메일을 받았습니다. 내 추측은 스택 오버플로가 귀하의 재귀 함수의 결함으로 인해지고있다. –

답변

2

C++ 기법 (모두 유효 함)에 대한 코드에 대한 모든 설명을 보면이 문제는 display 함수가 스택 오버플로를 일으키는 것으로 보입니다.

당신이 실제로 무엇을 left()left()에 전화를 대체 할 경우 명확하게 볼 수 있습니다

void display(int current, int indent) 
{ 
    if (withinHeap(2 * current)) 
     display(2 * current, indent + 4); 
    //... 
} 

을 우리는 display(0, 0);를 호출하면 그 함수가 반환 할 방법이 없다, 당신이와 display를 호출하고 있기 때문에 루프의 동일한 매개 변수 값.

withinHeap은 매개 변수가 범위 내에 있는지 확인하는 것 외에는 아무 것도하지 않으며 어떤 식 으로든 Heap 개체를 변경하지 않습니다. 0이 범위 내에 있으므로 withinHeap을 호출하면 항상 true이 반환됩니다. 따라서이 기능을 시작하자마자 문제가 발생하는 것입니다.

이 문제는 알고리즘 문제이므로 C++ 문제가 아니기 때문에이 문제를 해결하는 방법은 다루지 않을 것입니다. 그러나 내가 지적한 것은 코드가 오류를 일으키는 곳입니다.

관련 문제