C ++访问冲突读取位置错误

时间:2017-04-29 07:48:28

标签: c++ runtime-error

我有模板类MinMaxHeap,其中有两个堆

    template <class T> class MinMaxHeap {
    public:
    Heap<T> minHeap;
    Heap<T> maxHeap;
    int Size;
    int capacity;

    template <class T>
MinMaxHeap<T>::MinMaxHeap(int capacity) {
    this->capacity = capacity;
    this->Size = 0;
    maxHeap = Heap<T>(capacity, false);
    minHeap = Heap<T>(capacity, true);
    maxHeap.otherHeap = &minHeap;
    minHeap.otherHeap = &maxHeap;
}

还有Heap课程:

template <typename T> class Heap {

public:

    pair<T, int> *arr;
    int capacity;
    int size;
    Heap<T> *otherHeap;

    template <class T>
Heap<T>::Heap() {
}

template <class T>
Heap<T>::Heap(int capacity, bool isMin) {
    this->capacity = capacity;
    this->size = 0;
    arr = new pair<T, int>[this->capacity + 1];
    if (isMin) {
        arr[0] = pair<T, int>(NULL, 0);
    }
    else {
        arr[0] = pair<T, int>(NULL, 1);
    }
}

当我像这样MinMaxHeap<int> heap(20), MinMaxHeap<double> heap(20)创建MinMaxHeap时,它运行良好,但当我尝试制作MinMaxHeap<String> heap(20)时出现错误:

  

MinMaxHeap.exe中的0x55B63E90(ucrtbased.dll)抛出异常:   0xC0000005:访问冲突读取位置0x00000000。

经过一些调试后,我发现这些错误发生在这些行上:

if (isMin) {
        arr[0] = pair<T, int>(NULL, 0);
    }
    else {
        arr[0] = pair<T, int>(NULL, 1);
    }

如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

您无法从空指针创建id="{{ $index +1}}"

对于任意类型的默认值,

std::string不是一个好的选择 - 您应该使用NULL的“自己的”默认值T

答案 1 :(得分:-2)

NULL是c中的一个定义,它是这样的:        #define NULL 0

在我看来,它可以隐式地转换为int,并且加倍它不会是一个问题,但在字符串的情况下它不能被转换为字符串。

我认为你只是将这个变量添加到数组中以了解结束的位置,为什么不使用它的大小?和bool知道它是最小还是最大堆?