Получение "обнаружения повреждения кучи" при вызове delete [] для нескольких массивов в моем классе - C ++ - PullRequest
1 голос
/ 07 февраля 2020

У меня есть следующий код, где я выделяю память для трех int * в конструкторе класса. И удаляю его позже, в деструкторе класса. У меня проблема с удалением двух int * в деструкторе (я поместил комментарии в код ниже, где у меня возникла проблема):

#define CAP 3
class SetOfStacks
{
private:
    int* a1;
    int* a2;
    int* a3;
    int index = -1;
public:
    void push(int data);
    SetOfStacks()
    {
        a1 = new int[CAP];
        a2 = new int[CAP];
        a3 = new int[CAP];
    }
    ~SetOfStacks()
    {
        delete [] a1; //This works just fine
        delete [] a2; //heap corruption here
        delete [] a3; //heap corruption here
    }
};

void SetOfStacks::push(int data)
{
    if (index >= 3 * CAP)
    {
        cout << "stack overflow" << endl;
        return;
    }
    if(index>=-1 && index<=1)
    {
        index++;
        a1[index] = data;
    }
    else if (index >1  && index<=4)
    {
        index++;
        a2[index] = data;
    }
    else if (index >4 && index<=7)
    {
        index++;
        a3[index] = data;
    }
}


int main()
{
    SetOfStacks s;
    s.push(10);
    s.push(20);
    s.push(30);;
    s.push(40);
    s.push(50);
    s.push(60);
    s.push(70);
    s.push(80);
    s.push(90);

    return 0;
}

Я много раз отлаживал код, но я не уверен, почему я получаю HEAP CORRUPTION, когда я удаляю [] a2 и когда я удаляю [] a3. Выполнение delete [] a1 работает просто отлично. Я получаю следующую ошибку при удалении [] a2 и delete [] a3:

heap corruption detected

Знаете ли вы, почему я получаю эту ошибку, и что вызывает это (я запутался, почему удаление a1 работает нормально, но удаление a2 и a3 вызывает эту ошибку - хотя они go почти через один и тот же лог c в коде)?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2020

Все ваши массивы имеют длину CAP, что составляет 3 (судя по вашим операторам if), но вы не относите свои индексы при записи в массивы.

    else if (index >4 && index<=7)
    {
        index++;
        a3[index] = data;
    }

В этих строках вы можете записать индекс до 8 в массив. Вот почему вы получаете сообщение об ошибке:

CRT обнаружил, что приложение записало в память после завершения буфера кучи.

Это можно исправить с помощью оператора по модулю при записи в индексы с использованием index % CAP. Для правильной работы с любым CAP ваши операторы if должны также использовать >= N * CAP в качестве границ.

   else if (index >= 2 * CAP) // no upper check needed in an if-else chain
    {
        a3[index++ % CAP] = data; // you can also do index++ after
    }
1 голос
/ 07 февраля 2020

index выходит за пределы вашего массива:

if(index>=-1 && index<=1)
{
    index++;
    a1[index] = data; // index can be 0, 1 or 2 (fine)
}
else if (index >1  && index<=4)
{
    index++;
    a2[index] = data; // index can be 3, 4 or 5 (all out of range)
    // This fixes it:
    // a2[index - 3] = data; // index can now only be 0, 1 or 2
}
else if (index >4 && index<=7)
{
    index++;
    a3[index] = data; // index can be 6, 7 or 8 (all out of range)
    // This fixes it:
    // a3[index - 6] = data; // index can now only be 0, 1 or 2
}

Я также рекомендовал бы сделать условия более репрезентативными для используемых индексов, чтобы этот вид ошибки было легче обнаружить:

if(0 <= index && index < 3) {
    a1[index++] = data;
} else if (index < 6) {
    a2[index++ - 3] = data
} else if (index < 9) {
    a3[index++ - 6] = data;
}
...