在我的项目中,有一个可以设置房间的等级类
class Level
{
public:
Room * exit;
Room * position;
Level(Room setExit, Room newPosition);
~Level();
void showPosition();
};
在.h文件中重新提供
Level::Level(Room setExit, Room setPosition)
{
exit = &setExit;
position = &setPosition;
}
void Level::showPosition(){
position->printInfo();
}
房间类。
class Room
{
string title;
string info;
Room(string titleInput, string infoInput) :info(infoInput), title(titleInput){};
void printInfo();
.h function printinfo
void Room::printInfo(){
cout << title << endl;
}
我的主程序。
Room room1("Dungeon", "This is a dangerous room.");
room1.printInfo();
Level lvl1(room1, room1);
这种方法很好,但是当我打电话时。
lvl1.showPosition();
我得到了一个糟糕的分配。 所以我知道错误是在Level函数showPosition中。但为什么我会收到bad_alloc错误?
答案 0 :(得分:4)
Level
构造函数将发声或稍后引导您未定义的行为:
Level::Level(Room setExit, Room setPosition)
{
exit = &setExit;
position = &setPosition;
}
参数setExit
和setPosition
就像普通的局部变量一样,换句话说,一旦函数返回,它们就会超出范围(并被破坏)。这会留下两个迷路指针,指向现在被破坏的对象(以及可以重用的内存)。使用这些指针将为您提供UB。
如果你需要使用指针,将指针作为参数传递,并确保它们指向的对象的生命周期与Level
对象相同(或更大)。
您可以在这里使用std::shared_ptr
。
答案 1 :(得分:0)
Level::Level(Room setExit, Room setPosition)
{
exit = &setExit;
position = &setPosition;
}
Room
按值传递。您存储超出范围的临时地址。