簡體   English   中英

調試斷言失敗! 表達式:is_block_type_valid(header-> _ block_use)。 對象不會初始化和推送錯誤

[英]Debug Assertion Failed! Expression: is_block_type_valid(header->_block_use). Object wont init and Push error

在高級方面,請允許我感謝您為我查看此代碼,因為它已經困擾了我一段時間了,我似乎找不到問題。

每當我運行它時,它都不會在控制台內引發任何錯誤,而是會引發以下錯誤:

調試斷言失敗!

程序:[.exe的文件路徑]文​​件:minkernel \\ crts \\ ucrt \\ src \\ appcrt \\ heap \\ debug_heap.cpp第892行

表達式: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);
}

你為什么叫myHeap.~minHeap(); 這導致myHeap被破壞兩次,第二次調用試圖釋放已經釋放的內存。 這可能會導致您看到的錯誤。

您可以更簡潔地構造變量:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM