将字符串传递给函数时大小为 8 的读取无效

Invalid Read Of size 8 when passing a string to a function

我是 CS 的二年级学生,我想在寒假期间制作一个刽子手游戏来取乐。我在这里实现了菜单 class 的开头,是的,我知道这对于这个范围的项目来说太过分了,但我打算重用所有这些 classes.

无论如何,valgrind 告诉我一个大小为 8 的无效读取,它 return 按顺序包含以下几行:

menu::getName (menu.cpp:13) (这个在menu.cpp\getName()\return name;)

menu::print() (menu.cpp:21)(这是在 menu.cpp\print()\cout<<".return 到"

main (main.cppp:28) (这是在main.cpp\main()\thisMenu->print();)

我通常很擅长解决这类问题,我在网上搜索但找不到解决方案,我完全被难住了。我觉得这可能是一个简单的问题,我遗漏了一些东西,但我不确定。任何帮助是极大的赞赏!谢谢!

menu.cpp:

#include <vector>
using namespace std;
//contains a list of menus, allowing for us to navigate menus and keep track of where we are via linked list
class menu{
    private:
    //we will keep track of which menus this one can access via a vector and a parent pointer
    vector<menu*> options;
    string name="";
    menu* parent;
    public:
    string getName(){
        return name;
    }
    void insert(menu* obj){
        options.push_back(obj);
    }
    //print all the menus this one connects to, i.e. the menus the user can access from here
    void print(){
        int size=options.size();
        **if (parent!=nullptr){
            cout<<". return to "<<parent->getName();
        }** 
        for(int i=0; i<size; i++){
            cout<<i+2<<". "<<options[i]->getName()<<endl;
        }
    }
    menu* nextMenu(int input){
        try{
            return(options.at(input));
        }
        catch(...){
            return this;
        }
    }
    menu(string str, menu *parentIn){
        parent=parentIn;
        name=str;
    }
};

main.cpp:

#include "SkipList.h"
#include "menu.cpp"
#include <string>
using namespace std;
int main(int argc, char** argv) {
    SkipList *letterBank=new SkipList;
    vector<string> wordbank();
    //fill the letter bank with all lower case letters
    for(char currLetter=97; currLetter<123; currLetter++){
        Key currKey=to_string((int)currLetter);
        Value currVal=to_string(currLetter);
        letterBank->insert(currKey, currVal);
    }
    menu *MainMenu=new menu(string("Main Menu"), nullptr);
    menu *NumOfPlayers=new menu(string("Number of Players"), MainMenu);
    menu *PlayerSelect=new menu(string("Player Select"), NumOfPlayers);
    menu *Game=new menu(string("Game"), NumOfPlayers);
    menu *WordBankMenu=new menu(string("Word Bank Modification"), MainMenu);
    MainMenu->insert(NumOfPlayers);
    NumOfPlayers->insert(PlayerSelect);
    PlayerSelect->insert(Game);
    Game->insert(nullptr);
    MainMenu->insert(WordBankMenu);
    menu *thisMenu= MainMenu;
    int input;
    while(thisMenu!=nullptr){
        thisMenu->print();
        cin>>input;
        thisMenu=thisMenu->nextMenu(input);
    }
}

如果你看这一行:

cout<<". return to "<<parent->getName();

您在此处访问 parent 的姓名;

但是对于 MainMenu,parentnullptr,因此它是一个无效的访问!

该行需要以父项不同于 nullptr 为条件。