C++错误的分配错误

C++ bad alloc error

本文关键字:错误 分配 C++      更新时间:2023-10-16

在我的项目中,有一个可以设置房间的关卡类

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 函数打印信息

void Room::printInfo(){
    cout << title << endl;
}

我的主程序正在运行。

Room room1("Dungeon", "This is a dangerous room.");
room1.printInfo();
Level lvl1(room1, room1);

这工作正常,但是当我打电话时。

lvl1.showPosition();

我得到了一个不好的分配。所以我知道错误出在水平函数 showPosition 中。但是为什么我会收到bad_alloc错误?

Level构造函数将生成或稍后导致您出现未定义的行为

Level::Level(Room setExit, Room setPosition)
{
    exit = &setExit;
    position = &setPosition;
}

参数setExitsetPosition就像普通的局部变量一样,换句话说,一旦函数返回,它们就会超出范围(并被破坏(。这给你留下了两个杂散的指针,指向现在被破坏的对象(以及可以重用的内存(。使用这些指针将为您提供 UB。

如果需要使用指针,请将指针作为参数传递,并确保指针指向的对象具有与Level对象相同(或更长(的生存期。

潜在地,您可以在此处使用std::shared_ptr

Level::Level(Room setExit, Room setPosition)
{
    exit = &setExit;
    position = &setPosition;
}

Room按值传递。存储将超出范围的临时地址。