1

我取了一个指针 m_room(ServicePage 类中的 Room *m_room,updateRoom 和 addService 函数在哪里)

void ServicePage::updateRoom(QString _text)
{
    m_room = m_reservation->findRoom(_text.toInt());
    qDebug()<<m_room;
    qDebug() << m_room->m_idRoom;
}

Room *Reservation::findRoom(int _id)
{
    QVector<Room>::iterator iterator;
    for(iterator = mv_addRooms.begin(); iterator != mv_addRooms.end(); iterator++)
        if(iterator->m_idRoom == _id)
        {
            qDebug()<<_id;
            Room _temp = *iterator;
            return &_temp;
        }
    return null;
}

并且在 qDebug 之后回答是可以的,但是当我稍后在不同的函数中回答 qDebug 时:

bool ServicePage::addService()
{
    qDebug()<<m_room;
    qDebug()<<m_room ->m_idRoom;
    return true;
}

m_room 和之前一样,但是 m_room->m_idRoom 返回不同的值(随机值),这是为什么呢?

谢谢你的任何建议。

4

2 回答 2

6

findRoom()中,您将返回一个指向在堆栈上分配的变量的指针。

        qDebug()<<_id;
        Room _temp = *iterator;
        return &_temp;

函数返回时,返回值指向的内存findRoom()不再有效。

您可以通过简单地获取取消引用的迭代器的地址来解决此问题:

        qDebug()<<_id;
        return &*iterator;

这样,您将返回指向容器中实例的指针。如果您的容器是vector<>. 如果vector<>大小增加,则之前返回的所有指针值现在都无效。

于 2013-06-25T21:50:07.673 回答
0

声明_tempRoom &而不是Room。这样,&_temp是指向 mv_addRooms 中元素的指针,而不是堆栈上元素的副本。

于 2013-06-25T21:53:56.453 回答