在尝试删除指针时,我遇到了崩溃(我怀疑垃圾数据) 如果我运行它并输入1并填写问题,则数组递增,并且能够删除。但运行此并输入1两次(均填写数据)。我崩溃了数组递增,并保存我输入的两组数据。由于这是一个学校项目,我也无法使用载体。
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
#include "fileStuff.h"
bool menu();
bool menuOptions(int option);
void fileIO();
void listAll(interact * obs, int arryO);
interact addOne(interact * obs, int size);
interact subOne(interact * obs, int size);
int main()
{
bool isRunning = true;
while (isRunning)
{
isRunning = menu();
}
return 0;
}
interact addOne(interact * obs, int size)
{
interact *temp = new interact[size];
cout << temp[0].getBagId() << " from method." << endl;
for (int i = 0; i < size ; i++)
{
cout << temp[i].getBagId() << endl;
temp[i] = obs[i];
}
return *temp;
}
interact subOne(interact * obs, int size)
{
return *obs;
}
bool menu()
{
int option = 0;
cout << "1: add new backpack. " << endl
<< "2: delete a backpack "<< endl
<< "3: sort ascending by id " << endl
<< "4: sort descending by id " << endl
<< "5: list all backpacks " << endl
<< "6: quit" << endl;
cin >> option;
return menuOptions(option);
}
bool menuOptions(int option)
{
static int arrayO = 0;
cout << arrayO << endl;
static interact *obs = new interact[arrayO];
fileStuff test;
int tempBagId = 0, tempInvSpaces = 0, tempAmtOfItemsInInv = 0;
double tempInvMaxWeight = 0.0;
string tempBagType, tempBagCondish;
int t = 0 ;
int i = 0;
switch (option)
{
case 1:
cout << "bagId? ";
cin >> tempBagId;
cout << "How many inv spaces? ";
cin >> tempInvSpaces;
cout << "How much weight can the bag hold? ";
cin >> tempInvMaxWeight;
obs[arrayO].setBagId(tempBagId);
obs[arrayO].setInvSpaces(tempInvSpaces);
obs[arrayO].setInvMaxWeight(tempInvMaxWeight);
// test.writeToFile(obs, arrayO);
cout << "all stored" << endl;
arrayO++;
*obs = addOne(obs, arrayO);
cout << obs[0].getBagId() << "ERE" << endl;
break;
case 5:
//list all
listAll(obs, arrayO);
break;
case 6:
obs = NULL;
delete obs;
// exit(0);
return false;
break;
default:
break;
}
}
void listAll(interact * obs, int arryO)
{
int i = 0;
for (i; i <= arryO; i++)
{
cout << (obs + i)->getBagId() << endl;
cout << (obs + i)->getInvSpaces() << endl;
cout << (obs + i)->getInvMaxWeight() << endl;
}
}
答案 0 :(得分:5)
您使用
分配obs
static interact *obs = new interact[arrayO];
但是将其解除分配:
delete obs;
改为使用delete[]
。
此外,您在删除它之前清除了obs
,它永远无法正常工作。
正如@piwi所指出的,第二次没有初始化它,因为它是一个静态变量。
坦率地说,动态分配的目的在这里我不清楚。除了它首先不应该是static
这个事实,而是一个类实例,你可以使用值语义和std::array
。
答案 1 :(得分:3)
您的代码有多处错误。但是,当您分配大小为array0
的数组然后访问obs[array0]
时,内存损坏就会开始。索引已经太多了,并且随着array0
越来越大,它只会越过分配数组的末尾。
此外,您的addOne
功能完全错误。它分配一个新的,更大的数组,小心地将数据复制到其中,然后返回新数组的第一个元素的内容(而不是新数组本身)。新数组本身就被丢弃(泄露),因为你不会将指针返回给它。
对于实际的delete
,Bartek当然是正确的,它应该是delete[]
,但无论如何你只会删除一个空指针:
obs = NULL;
delete obs;
在为obs
指定空指针之前,obs
以前指向的数组没有做任何事情。