c++ - 为什么在使用动态内存分配时这段代码会抛出异常?
问题描述
下面的程序创建一个新的[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;
}
}
解决方案
您正在越界访问数组。当 时items == arrSize
,您尝试写入ptr[lastElement]
,因为lastElement
和items
将具有相同的值,所以将写入ptr[arrSize]
超过分配空间末尾的哪个。
您的数组扩展代码中也存在许多问题,并且您正在传递不需要的参数。
推荐阅读
- regex - 正则表达式垂直替换
- multi-factor-authentication - 启用 MFA 后,本机 iOS 邮件应用程序停止工作
- azure - Azure 服务总线和 MassTransit iConsumer 业务逻辑
- function - 在 Haskell 中,如何将嵌套上下文中的函数“应用”到上下文中的值?
- installation - 为什么 Lua 二进制文件包含 .h 和 .c 文件,但 Lua IUP 二进制文件包含 .DLL?
- nlp - Spacy模型从本地目录加载错误
- java - mockito-inline 可以模拟私有方法吗?
- c++ - 使用带有终止字符的 switch 语句,在本例中为 '='
- go-gorm - GORM db.First 自动打印日志
- javascript - React - 材料标签在文本字段中的位置不正确