Почему этот код вызывает исключение при использовании динамического выделения памяти c? - PullRequest
0 голосов
/ 19 марта 2020

Следующая программа создает новый массив структур из [n+5] элементов, каждый раз, когда количество достигает 5, 10, 15, ... и копирует старые элементы в новый массив.

Это ошибка, выданная:

Исключение, выданное в 0x7AE740DF (vcruntime140d.dll) в ConsoleApplication4.exe: 0xC0000005: Место записи нарушения прав доступа 0x6CBFEBB8.

Ошибка выводится в строке 69, где написано items += 1;

#include <iostream>
#include <iomanip>

using namespace std;

struct item{
    string name;
    int eff;
};

item* ptr = nullptr;
item* temp = nullptr;
int itemsA = 0;
int arrSize = 5;
int lastElement = 0;


void func(int&, item *& ,int&, int& , item*&);

int main()
{
    ptr = new item[arrSize];

    func(arrSize, ptr,itemsA,lastElement, temp);


}
void func(int& arrSize, item *& ptr, int &items, int&lastElement, item *& temp)
{
    bool event = false;
    int a = 1;
    while (a == 1)
    {
        cout << "Your array size is: " << arrSize << endl;
        if (items > arrSize)
        {
            temp = new item[arrSize];

            for (int x = 0; x < arrSize; x++)
            {
                temp[x].eff = ptr[x].eff;
                temp[x].name = ptr[x].name;
            }
            arrSize += 5;
            delete[] ptr;
            ptr = nullptr;
            ptr = new item[arrSize];

            for (int x = 0; x < arrSize; x++)
            {
                ptr[x].name = temp[x].name;
                ptr[x].eff = temp[x].eff;
            }
            delete[] temp;
            temp = nullptr;

        }
        int any;
        string any2;
        cout << "ENter name for position number: " << lastElement + 1 << "\n";
        cin >> any2;
        cout << "ENter int for hp effect for position number: " << lastElement + 1 << "\n";
        cin >> any;
        ptr[lastElement].eff = any;
        ptr[lastElement].name = any2;
        items +=1;                                //////////the error is thrown here
        cout << "You now have " << items << " items.\n";


        cout << "Items in your bag: \n";
        for (int x = 0; x < items; x++)
        {
            cout << ptr[x].name << " which gives you extra " << ptr[x].eff << " health when used.\n";
        }
        lastElement += 1;

    }
}

1 Ответ

1 голос
/ 19 марта 2020

Вы получаете доступ к массиву за пределами. Когда items == arrSize, вы пытаетесь записать в ptr[lastElement], который, поскольку lastElement и items будут иметь одинаковое значение, будет записывать в ptr[arrSize], который находится за концом выделенного пространства.

В коде расширения массива также есть многочисленные проблемы, и вы передаете параметры, которые вам не нужны.

...