将字符串传递给函数时大小为 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,parent
是 nullptr
,因此它是一个无效的访问!
该行需要以父项不同于 nullptr
为条件。
我是 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,parent
是 nullptr
,因此它是一个无效的访问!
该行需要以父项不同于 nullptr
为条件。