C ++错误的alloc错误

时间:2015-10-11 14:50:40

标签: c++

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

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错误?

2 个答案:

答案 0 :(得分:4)

Level构造函数将发声或稍后引导您未定义的行为

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

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

如果你需要使用指针,将指针作为参数传递,并确保它们指向的对象的生命周期与Level对象相同(或更大)。

您可以在这里使用std::shared_ptr

答案 1 :(得分:0)

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

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