C++ 删除指向数组的指针时程序崩溃

C++ 删除指向数组的指针时程序崩溃,c++,C++,在尝试删除指针obs时,我遇到了崩溃(我怀疑是垃圾数据) 如果我运行此命令并输入1并填写问题,数组将向右递增,并且可以删除。但运行此命令并输入1两次后(都填写数据)。我撞车了。数组递增,并保存我输入的两组数据。我也不能使用向量,因为这是一个学校的项目 #include <fstream> #include <iostream> #include <iomanip> #include <string> using namespace std;

在尝试删除指针obs时,我遇到了崩溃(我怀疑是垃圾数据) 如果我运行此命令并输入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;
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
#包括“filestaff.h”
bool菜单();
布尔菜单选项(整数选项);
void fileIO();
void listAll(交互*obs,int arryO);
interact addOne(interact*obs,整数大小);
交互子节点(交互*obs,整数大小);
int main()
{ 
bool isRunning=true;
同时(正在运行)
{
isRunning=菜单();
}
返回0;
}
interact addOne(interact*obs,整数大小)
{
交互*临时=新交互[大小];

您是否可以分配
obs

static interact *obs = new interact[arrayO];
但将其分配给:

delete obs;
改用
delete[]


此外,在删除obs之前,您正在清除它,因为它永远不会正常工作


正如@piwi所指出的,第二次不初始化它,因为它是一个静态变量



坦白地说,我并不清楚动态分配的目的。除了首先它不应该是一个
静态的
,而是一个类实例之外,您可以使用值语义和
std::array
您的代码有多个错误。但是,当您分配一个数组的大小
array0
,然后访问
obs[array0]
。索引已经太多了,当
array0
越大时,它就越远离所分配数组的末尾

另外,您的
addOne
函数完全错误。它分配一个新的、更大的数组,小心地将数据复制到其中,然后返回新数组的第一个元素的内容(而不是新数组本身)。新数组本身被丢弃(泄漏),因为您没有返回指向它的指针

至于实际的
delete
,Bartek当然正确,它应该是
delete[]
,但在任何情况下,您只删除空指针:

obs = NULL;
delete obs;

在为
obs
分配空指针之前,这对
obs
用来指向的数组没有任何影响。应该缩短此代码的可能副本,并删除所有不必要的位。
addOne
返回单个
interact
对象,但您取消了对动态分配数组的引用返回单个实例。另外,我在菜单选项中没有看到任何类型的
delete
(内存泄漏!)您正在分配一个大小为0的数组。然后您尝试将值放入该数组。然后您尝试用新数组替换指针来扩展它。您设置
obs=NULL
,然后调用
delete[]obs
。这不会释放由
obs
指向的内存。我已尝试将delete obs更改为delete[]OBS;我仍然在崩溃,我认为它第二次崩溃是因为<代码> OBS<代码>被删除,并且不再被实例化,因为它是静态变量。很遗憾,我不允许用户矢量因为学校弹出式的东西永远不会理解为什么学校C++课程不教C++。@ MichaelLapan复制源代码<矢量< /代码> FR。从您的标准库或其他广泛使用的实现中,将它们粘贴到您的代码中,然后使用它们(只要您了解
vector
的工作原理,如果有人问,解释它应该不是一个问题)。这个要求是荒谬的。@BartekBanachewicz:这几乎肯定会被视为剽窃(在学术意义上,尽管标准库代码上的许可证允许它)。@BartekBanachewicz:那是……嗯,对不起,但这是一个非常愚蠢的建议,你知道的。