指针成员变量具有不同的值

时间:2011-01-02 14:54:29

标签: c++ qt

好的,首先,这是我的代码:

HyperSprite::HyperSprite()
{
    _view = 0;
}

void HyperSprite::publish(QGraphicsView* view) {
    _view = view;
}

void HyperSprite::getKFrame() {
    if(_view != 0) {
        qDebug()<<(void*)_view;
    }
}

现在,如果我从HyperSprite::getKFrame()内拨打main(),我会收到输出:

0xbf8ffb84

我有一台TCP服务器,需要这个QGraphicsView*变量。因此,无论何时建立新连接,都会调用HyperSprite::getKFrame()。但是,每当我建立与服务器的连接时,这就是输出:

0x1e425ff

老实说,我不明白这一点。成员的价值不应该始终保持一致吗?为什么指针值会改变?很明显,每当我尝试使用_view指针访问其任何成员时,就会发生分段错误。我尝试使用QSharedPointer,但它也导致了同样的问题。 QSharedPointer的数据会自动更改。为什么会这样?

3 个答案:

答案 0 :(得分:1)

“成员的值是否应始终保持相同?”否。如果它不是常量,并且如果它被赋值为新值,则会发生变化。

不包括计算内存违规,可能会有以下解决方案:

  1. 您处理另一个HyperSprite对象,因此可能有一个不同的_view成员。
  2. void publish(QGraphicsView * view)在不同的QGraphicsView上被多次调用。或另一个修改_view ...
  3. 值的函数成员
  4. 您的_view是公开的,外部对象会更改其值
  5. 对象是您对象的朋友,并修改了_view
  6. 的值

    这种情绪......

答案 1 :(得分:0)

如果任何变量正在改变(如果它是一个成员并不重要,如果它是一个指针并不重要),当你没有分配它时,你有一个内存管理错误在其他地方在您的计划中。

它可以迭代一个缓冲区的一端,它可能是在释放它指向它的对象之后使用一个悬空指针,它可能是使用一个从未初始化的指针。

如果您可以使用Dialecticus评论的数据断点,您将能够非常轻松地找到此特定错误。通常,您应该使用像valgrind这样的工具来检查这样的内存管理错误,因为导致此问题的样式可能会产生您尚未注意到的其他错误。

答案 2 :(得分:0)

听起来你的数据会因为流程边界而受到影响。