程序崩溃uppon删除指向数组的指针

hur*_*nhu 0 c++

在尝试删除指针时,我遇到了崩溃(我怀疑垃圾数据)如果我运行它并输入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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*icz 5

您分配obs

static interact *obs = new interact[arrayO];
Run Code Online (Sandbox Code Playgroud)

但是将其解除分配:

delete obs;
Run Code Online (Sandbox Code Playgroud)

delete[]改用.


obs 删除它之前你也要清除它,它永远不会有正常工作的机会.


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


坦率地说,动态分配的目的在这里我不清楚.除了它首先不应该是一个事实static,而是一个类实例,你可以只使用值语义和std::array.

  • 此外,我认为它第二次崩溃,因为`obs`被删除而没有再次实例化,因为它是一个静态变量. (2认同)