首页 > 解决方案 > 为什么在使用动态内存分配时这段代码会抛出异常?

问题描述

下面的程序创建一个新的[n+5]元素结构数组,每次数量达到5, 10, 15, ... 并将旧元素复制到新数组中。

这是抛出的错误:

在 ConsoleApplication4.exe 中的 0x7AE740DF (vcruntime140d.dll) 处引发异常: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;

    }
}

标签: c++pointersexceptionmemorydynamic

解决方案


您正在越界访问数组。当 时items == arrSize,您尝试写入ptr[lastElement],因为lastElementitems将具有相同的值,所以将写入ptr[arrSize]超过分配空间末尾的哪个。

您的数组扩展代码中也存在许多问题,并且您正在传递不需要的参数。


推荐阅读