关于#C++#的问题,如何解决?(开发工具-visual studio)

X64。刚刚学C++,不知道哪出错了,代码运行不下去,想知道哪里出错和应该去补哪方面的内容学;求指导,谢谢!
引发异常的地方已经标了注释,大概是106行。
(0x00007FF6EEDAA7EC 处(位于 staff management system.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000000 时发生访问冲突。)

#include<iostream>
using namespace std;
#include<string>
#include<fstream>


void showMenu()
{
    cout << "欢迎使用职工管理系统" << endl
        << "0.退出管理程序" << endl
        << "1.增加职工信息" << endl
        << "2.显示职工信息" << endl
        << "3.删除职工信息" << endl
        << "4.查找职工信息" << endl
        << "5.按照编号排序" << endl
        << "6.清空所有文档" << endl;
}
class staff
{
public:
    virtual void showdetail() = 0;
    
    int m_num;
    string m_name;
    int m_post;
    string m_duty;
};
class employee :public staff
{
public:
    employee() {};
    employee(int num, string name, int post)
    {
        this->m_num = num; this->m_name = name; this->m_post = post;
    }
        virtual void showdetail()
        {
        m_duty = "完成经理交代的任务";
        cout << "编号:" << m_num << " 姓名:" << m_name << " 岗位:" << m_post << " 职责:" << m_duty << endl;
        }
};
class manager :public staff
{
public:
    manager() {};
    manager(int num, string name, int post)
    {
        m_num = num; m_name = name; m_post = post;
    }
    virtual void showdetail()
    {
        m_duty = "完成老板交代的任务";
        cout << "编号:" << m_num << " 姓名:" << m_name << " 岗位:" << m_post << " 职责:" << m_duty << endl;
    }
};
class boss :public staff
{
public:
    
    boss() {};
    boss(int num, string name, int post)
    {
        m_num = num; m_name = name; m_post = post;
    }
    virtual void showdetail()
    {
        m_duty = "吃喝玩乐";
        cout << "编号:" << m_num << " 姓名:" << m_name << " 岗位:" << m_post << " 职责:" << m_duty << endl;
    }
};
class temptRec
{
public:
    staff** staffTab;
    int staffAmount = 0;
    void addStaff()
    {
        while (1)
        {
            cout << "请输入员工编号" << endl;
            int num;
            cin >> num;
            cout << "请输入员工姓名" << endl;
            string name;
            cin >> name;
        flag2:
            cout << "请输入员工岗位: 1-普通职工 2-经理 3-老板" << endl;
            int post;
            cin >> post;
            staffAmount++;

            staff* sta;
            sta = NULL;
            switch (post)
            {
            case 1: sta = new employee(num, name, post); break;
            case 2: sta = new manager(num, name, post); break;
            case 3: sta = new boss(num, name, post); break;
            default:break;
            }
            if (post != 1 && post != 2 && post != 3)
            {
                cout << "输入有误,请重新输入" << endl;
                goto flag2;
            }
            staffTab[staffAmount - 1] = sta;//这里引发异常0x00007FF61E2CA7EC 处(位于 staff management system.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000000 时发生访问冲突。
            ofstream ofs;
            ofs.open("address.txt", ios::out);
            for (int i = 0; i < staffAmount; i++)
            {
                ofs << staffTab[i]->m_num << " " << staffTab[i]->m_name << " " << staffTab[i]->m_post << " "
                    << staffTab[i]->m_duty << endl;
            }
            ofs.close();
            delete sta;
        flag1:
            cout << "是否继续添加?0-退出 1-继续添加" << endl;
            int a;
            cin >> a;
            if (a == 0) { break; }
            else if (a != 1) {
                cout << "输入错误,请重新输入" << endl;
                goto flag1;
            }
        }
    };

};
void showDetail()
{
    ifstream ifs;
    ifs.open("address.txt", ios::in);
    employee emp;
    ifs.read((char *)&emp,sizeof(emp));
    cout << emp.m_num<<" "<<emp.m_name;
}
int main()
{
    temptRec temp;
    while (1)
    {
        showMenu();
        int choose;
        cin >> choose;
        switch (choose)
        {
        case 0: break;
        case 1:temp.addStaff(); break;
        case 2:showDetail(); break;
        default:break;
        }
        system("pause");
        system("cls");
    }


    system("pause");
    return 0;
}

小魔女参考了bing和GPT部分内容调写:
你可以尝试以下步骤来解决你的问题:

  1. 首先,检查你的代码是否有语法错误。你可以使用Visual Studio的语法检查功能来检查你的代码,以确保你的代码没有语法错误。
  2. 其次,检查你的代码是否有逻辑错误。你可以使用Visual Studio的调试功能来检查你的代码,以确保你的代码没有逻辑错误。
  3. 最后,检查你的代码是否有编译错误。你可以使用Visual Studio的编译功能来检查你的代码,以确保你的代码没有编译错误。

如果你的代码没有任何错误,那么你可以尝试更深入地学习C++,以更好地理解你的代码。你可以通过阅读书籍、参加在线课程或参加实体课程来学习C++。你还可以参加社区论坛,与其他C++程序员交流,以获得更多的帮助。
回答不易,记得采纳呀。

这段代码中的异常是由于使用了空指针来访问内存而导致的。具体来说,在temptRec类的addStaff()方法中,当创建一个新的staff对象时,如果用户输入的岗位不是1、2或3,则该方法将使用goto语句将控制流程跳转到一个标签flag2,以重新获取用户的输入。但是,如果在跳转回到flag2之后,再次尝试创建新的staff对象,则该方法将使用之前已经释放的内存空间,因此会引发异常。

解决该问题的方法是不使用goto语句来跳转控制流程。相反,你可以使用一个循环来获取用户的输入,直到用户输入有效的岗位。另外,也可以使用vector容器来管理staff对象的集合,而不是使用动态数组。这样可以更方便地管理对象的生命周期,并避免内存泄漏和空指针引用等问题。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

如果需要使用动态数组,那么需要用new分配空间
修改代码:

staff** staffTab=new staff*;