Получение противоречивого повреждения кучи для массива int - C ++ - PullRequest
0 голосов
/ 24 февраля 2020

Я пробую следующую программу и получаю кучу повреждений, что и ожидается. Ниже приведен код ниже:

int main()
{
    int A[] = { 2,4,16,32,0,0,0,0 };
    int B[] = { 5,17,31,35 };
    int i = 0, j = 0,k=0;
    int length = sizeof(A) / sizeof(A[0]);
    int* temp = new int[length];
    while (k<length && A[k]!=0)
    {
        if (A[i] < B[j])
        {
            temp[k] = A[i];
            i++;
        }
        else
        {
            temp[k] = B[j];
            j++;
        }
        k++;
    }
    //copythe remaining items in A[] into temp.
    while (i < length && A[i] != 0)
    {
        temp[k] = A[i];
        i++; k++;
    }
    //copy the remaining items in B[] into temp.
    while (j < length)
    {
        temp[k] = B[j];
        j++; k++;
    }
    cout << "the sorted array is: ";
    for (int i = 0; i < length; i++)
    {
        cout << temp[i] << ", ";
    }
    return 0;
}

Произошло повреждение кучи, потому что я пишу за пределы массива temp. По моему мнению, повреждение кучи должно было произойти в строке 7244, где я назначаю B [j] для temp [k] - и k превышает length (то есть 8) - как выделено ниже:

enter image description here

Но повреждение кучи происходит намного позже, в строке 7250 - где я пытаюсь cout<<temp[0]. -

enter image description here

У меня есть пара вопросов:

  1. Почему происходит повреждение кучи при попытке прочитать temp[0] - поскольку все должно быть хорошо при попытке прочитать temp[0]?
  2. Почему повреждение кучи не происходит в самой строке 7244, где я назначаю B[j] для temp[k] и k превышает length.
  3. Почему повреждение кучи прерывается. Я поражал кучу коррупции 4-5 раз в начале, но не ударил ли она сейчас?

1 Ответ

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

Запись за пределы массива всегда является неопределенным поведением. Это, как говорится, ничего плохого не произойдет, когда вы вызываете неопределенное поведение. Повреждение кучи только возможно происходит, потому что, произойдет ли это, зависит от того, где произошло распределение temp относительно структур данных, которые составляют кучу.

При этом, когда происходит повреждение кучи, оно происходит в указанной вами строке, где temp[k] = B[j]. Программа не замечает, что куча повреждена, пока вы не попытаетесь распечатать temp с использованием cout, и причина этого кроется в повреждении кучи, только когда вы пытаетесь выполнить операции, связанные с кучей (например, распределение или удаление). Вполне вероятно, что cout << temp[i] << '", " выполняет либо выделение, либо удаление под капотом как часть процесса распечатки temp[i], и это то, что вызывает крэ sh.

...