2016-09-17 2566 views
2

在高級,讓我感謝您爲我查看此代碼,因爲它一直在困擾我一段時間,我似乎無法找到問題。調試斷言失敗!表達式:is_block_type_valid(header - > _ block_use)。對象不會初始化和推送錯誤

每當我運行它,它不會在控制檯中拋出任何錯誤,而是拋出這個錯誤:

Debug Assertion Failed!

Program: [Filepath to .exe] File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp Line 892

Expression: is_block_type_valid(header->_block_use)

我一直在試圖弄明白,但對我來說只是不會工作。我相信它與我傳入的模板類型有關,因爲只要我嘗試初始化minHeap對象或嘗試使用我的Push方法(我也認爲這是一個問題),它就會崩潰。

再一次,非常感謝你看我的代碼。

主營:

#include "minHeap.h" 
#include "Node.h" 
#include <iostream> 

using namespace std; 

int main() { 
    Node<char> A = Node<char>(0, 'A'); 
    Node<char> B = Node<char>(1, 'B'); 
    Node<char> C = Node<char>(2, 'C'); 
    Node<char> D = Node<char>(3, 'D'); 

    minHeap<char> myHeap = minHeap<char>(); 

    //Below doesn't work, something about subscript is not of integrap type 
    //myHeap.push(A.index, A.value); 
    //myHeap.push(B.index, B.value); 
    //myHeap.push(C.index, C.value); 
    //myHeap.push(D.index, D.value); 

    cout << A.index << endl; 

    myHeap.~minHeap(); 

    return 0; 
} 

這裏是Node.h:

#pragma once 

template<typename T> 
class Node 
{ 
public: 
    float index; 
    T value; 

    Node(float indx, T val); 
    ~Node(); 
}; 

template<typename T> 
inline Node<T>::Node(float indx, T val) 
{ 
    index = indx; 
    value = val; 
} 

template<typename T> 
inline Node<T>::~Node() 
{ 
} 

最後,minHeap:

#pragma once 

template<typename T> 
class minHeap 
{ 
private: 
    T* arr[100]; 
    int arrSize = 0; 

    void heapifyUp(int indx); 
    void heapifyDown(int indx); 
    int getParent(int indx); 
    int childLeft(int indx); 
    int childRight(int indx); 
    int swap(int indxA, int indxB); 

public: 
    minHeap(); 
    ~minHeap(); 

    void push(int indx, T val); 
    void pop(); 
}; 

template<typename T> 
inline minHeap<T>::minHeap() 
{ 
} 

template<typename T> 
inline minHeap<T>::~minHeap() 
{ 
    delete[] arr; 
} 

template<typename T> 
inline void minHeap<T>::heapifyUp(int indx) 
{ 
    if (indx <= 0) return; 
    int j = getParent(indx); 
    if (arr[indx] < arr[j]) { 
     int temp = arr[indx]; 
     arr[indx] = arr[j]; 
     arr[j] = temp; 
    } 
    heapifyUp(j); 
} 

template<typename T> 
inline void minHeap<T>::heapifyDown(int indx) 
{ 
    int j; 

    //if no left child 
    if (childLeft(indx) > arrSize - 1) return; 

    //if no right child 
    if (childRight(indx) > arrSize - 1) j = childLeft(indx); 

    //No children 
    else j = (arr[childLeft(indx)] < arr[childRight(indx)]) ? (childLeft(indx)):(childRight(indx)); 

    if (arr[indx] > arr[indx]) { 
     int temp = arr[indx]; 
     arr[indx] = arr[j]; 
     arr[j] = temp; 
    } 
    heapifyDown(j); 
} 

template<typename T> 
inline int minHeap<T>::getParent(int indx) 
{ 
    return (indx - 1)/2; 
} 

template<typename T> 
inline int minHeap<T>::childLeft(int indx) 
{ 
    return 2 * i + 1; 
} 

template<typename T> 
inline int minHeap<T>::childRight(int indx) 
{ 
    return 2 * i + 2; 
} 

template<typename T> 
inline int minHeap<T>::swap(int indxA, int indxB) 
{ 
    int tempA = arr[indxA]; 
    int tempB = arr[indxB]; 

    arr[indxA] = tempB; 
    arr[indxB] = tempA; 

    return 0; 
} 

template<typename T> 
inline void minHeap<T>::push(int indx, T val) 
{ 

    //Something with Array is broken. Fix it pupper 
    int tempVal = arr[indx]; 
    arr[indx] = val; 
    arrSize += 1; 
    heapifyUp(arrSize - 1); 
} 

template<typename T> 
inline void minHeap<T>::pop() 
{ 
    int temp = arr[0]; 

    arr[0] = arr[arrSize - 1]; 
    arr[arrSize - 1] = nullptr; 
    arrSize -= 1; 
    heapifyDown(0); 
} 
+2

歡迎堆棧溢出。你訪問過[幫助中心](http://stackoverflow.com/help)嗎?您是否熟悉[最小完整示例](http://stackoverflow.com/help/mcve)的概念? – Beta

回答

0

你爲什麼打電話myHeap.~minHeap();?這導致myHeap被銷燬兩次,第二次嘗試釋放已釋放的內存。這可能會導致您看到的錯誤。

你可以更簡潔構造的變量很多:

Node<char> A(0, 'A'); 
minHeap<char> myHeap; 
+0

感謝您的迴應!我編輯了你建議的內容,但是即使刪除了myHeap,錯誤仍然出現。〜minHeap(); – jm6676

+0

這段代碼有很多問題。我指出了最明顯的一個。另一個相關的是你聲明'T * arr [100];',這是一個指向T的指針數組,然後在析構函數中調用'delete [] arr;'這是無效的,因爲arr是一個數組並且hasn' t被分配了'new'。 (你只能'刪除'你用'new'分配的東西。) – 1201ProgramAlarm