Обнаружено повреждение кучи после нормального блока (# 193) в 0x014E5A28 - PullRequest
0 голосов
/ 29 января 2020

Я делал код, в котором я должен создать динамический массив c и указатель (указатель должен использоваться для перемещения по данным массива). Я должен сделать методы get (чтобы вернуть индекс числа для поиска в массиве), update (когда метод get возвращает индекс, метод update может обновить значение), length (этот метод должен возвращать размер массива ), next (этот метод должен перемещать указатель на следующий индекс массива), start (этот метод должен перемещать указатель на начало массива), end (этот метод должен перемещать указатель на конец массива) и Add (он должен добавить блок в массив)

Вот код

#include <iostream>
#include <conio.h>

using namespace std;

class Runner
{
private:
    int *arr;
    int *ptr;
    int size;

    // to input in array

    void Input()
    {
        for (int i = 0; i < size; i++,*ptr++)
        {
            cout << "Enter value no. " << i + 1 << "\t";
            cin >> arr[i];
        }
    }

    //to allocate memory
    void Create()
    {
        cout << "Enter the total number of elements :\t";
        cin >> size;

        arr = new int[size];
        ptr = arr;

        Input();
    }

public:
    //constructor to define starting value
    Runner()
    {
        ptr = NULL;
        size = 0;
        arr = NULL;
    }

    //get function
    int get(int num)
    {
        bool NotNull = false;
        int index = 0;

        do
        {
            if (ptr != NULL)
            {
                ptr = &arr[0];
                for (int i = 0; i < size; i++,*(ptr++))
                {
                    if (num == *ptr)
                    {
                        index = i;
                        break;
                    }
                }
                NotNull = true;
            }

            else
            {
                Create();
            }
        } while (!NotNull);

        return index;
    }

    //update function
    void Update(int num)
    {
        int val;
        int index = get(num);

        cout << "Enter value to update :\t";
        cin >> val;

        ptr = ptr + index;
        *ptr = val;
    }

    //length function
    int length()
    {
        if (ptr == NULL)
        {
            Create();
        }

        return size;
    }

    //moving pointer back
    void Back()
    {
        bool NotNull = false;

        do
        {
            if (ptr != NULL)
            {
                *(ptr--);
                NotNull = true;
            }

            else
            {
                Create();
            }
        } while (!NotNull);
    }

    //moving pointer forward;
    void Next()
    {
        bool NotNull = false;

        do
        {
            if (ptr != NULL)
            {
                *(ptr++);
                NotNull = true;
            }

            else
            {
                Create();
            }
        } while (!NotNull);
    }

    //to point at the start of array
    void Start()
    {
        bool NotNull = false;

        do
        {
            if (ptr != NULL)
            {
                ptr = &arr[0];
                NotNull = true;
            }

            else
            {
                Create();
            }
        } while (!NotNull);
    }

    //to move pointer to the end
    void End()
    {
        bool NotNull = false;

        do
        {
            if (ptr != NULL)
            {
                ptr = &arr[size - 1];
                NotNull = true;
            }

            else
            {
                Create();
            }
        } while (!NotNull);
    }

    //to add a block into array
    void Add()
    {
        int NewSize = size + 1;
        int *temp = new int[NewSize];
        for (int i = 0; i < size; i++)
        {
            temp[i] = arr[i];
        }
        size = NewSize;
        ptr = temp;
        if (arr != NULL)
        {
            delete[] arr;
        }
        arr = NULL;
        arr = temp;
        cout << "You have been provided a new block to add 1 data entry\n";
        cout << "Enter value :\t";
        cin >> arr[size - 1];
    }
};

int main()  //main made just for testing above method's working
{
    Runner *obj = new Runner();

    obj->get(3);
    obj->Update(20);
    cout << obj->length() << "\n";
    obj->Next();
    obj->End();
    obj->Back();
    obj->Start();
    obj->Add();

    delete obj;

    _getch();
    return 0;
}

Ну, часть кода, которая дает мне ошибку, это метод Add, в котором мне нужно увеличить размер массив без использования realloc().

Метод добавления выглядит следующим образом:

void Add()
    {
        int NewSize = size + 1;
        int *temp = new int[NewSize];
        for (int i = 0; i < size; i++)
        {
            temp[i] = arr[i];
        }
        size = NewSize;
        ptr = temp;
        if (arr != NULL)
        {
            delete[] arr;   //the point where heap corruption error occurred
        }
        arr = NULL;
        arr = temp;
        cout << "You have been provided a new block to add 1 data entry\n";
        cout << "Enter value :\t";
        cin >> arr[size - 1];
    }

Помогите мне в решении этой проблемы.

1 Ответ

2 голосов
/ 29 января 2020

Последние два оператора в Update

    ptr = ptr + index;
    *ptr = val;

установят указатель на некоторое значение относительно последнего значения, которое было установлено в предыдущем вызове get. Это заставит ptr обращаться к памяти за пределами выделенного пространства для arr, если значение было найдено во второй половине массива. Когда вы присваиваете значение с *ptr = val;, вы в лучшем случае записываете неправильный элемент массива, а в худшем - записываете в память, которой вы не владеете. Ошибка «Повреждение кучи» обнаруживает это.

Решение было бы установить ptr, используя вместо этого arr:

ptr = arr + index;

, поскольку ptr может указывать после конца выделенное пространство, если номер не был найден (и index будет 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...