【问题标题】:C++ function used to work, now returning 0xfdfdfdfdC++ 函数曾经工作,现在返回 0xfdfdfdfd
【发布时间】:2012-01-27 16:48:20
【问题描述】:

我有一些几年前写的代码。它一直运行良好,但是在最近用其他地方的一些新的、不相关的代码重建之后,它不再工作了。这是代码:

//myobject.h
...
inline  CMapStringToOb* GetMap(void)    {return (m_lpcMap);};
...

上面是从主应用程序访问的,如下所示:

//otherclass.cpp
...
CMapStringToOb* lpcMap = static_cast<CMyObject*>(m_lpcBaseClass)->GetMap();
...

就像我说的,这个 WAS 工作了很长时间,但它只是决定从我们最近的构建开始失败。我已经对此进行了调试,并且可以看到,在设置指针的代码中,它正确地将内存地址设置为实际值。我什至可以单步进入set函数,记下内存地址,然后移动到这个函数,让它得到0xfdfdfdfd,然后在调试器中手动获取内存地址。这会导致代码工作。现在,根据我的阅读, 0xfdfdfdfd 意味着保护字节或“无人区”,但我并不真正理解它的含义。据说这也意味着一个错误,但我不明白如果代码以前可以工作的话,怎么会发生这种情况。

【问题讨论】:

  • 听起来你已经进入了未定义行为的美妙之地。如果您有权访问 Purify,您可以使用它来提供帮助。或者,如果您可以在 Linux 上编译一小部分代码,valgrind 将是您的朋友。
  • 检查 set 函数中的更改,其中设置了同名的局部变量而不是成员变量。我已经多次看到这个错误了。
  • 也许对象没问题,但指向它的指针被损坏 - 你检查了吗?也许地址没问题,但对象被破坏了?你不能在 &m_lpcMap 上设置一个观察点并在它被覆盖时停止执行吗?
  • “在最近用其他地方的一些新的、不相关的代码重建之后,它不再工作了”……听起来它毕竟是相关的。
  • 你怎么知道m_lpcBaseClass实际上指向CMyObject的一个实例?如果基类是多态的,那么你可以使用dynamic_cast 来确定。

标签: c++ pointers inline-functions


【解决方案1】:

我从匈牙利符号中假设您正在使用 Visual Studio。由于您确实知道保存映射指针的地址,因此请在调试器中启动程序并在映射指针更改时设置数据断点(保存映射指针的内存,而不是指向的映射)。当它被覆盖时,您会准确地发现

【讨论】:

  • 这是一个很好的答案,我发现的主要线索之一是我无法进入某些功能,因为调试信息没有从其他库构建到我的调试版本中。
【解决方案2】:

0xfdfdfdfd 通常意味着您访问了不应该访问的内存。

  • 很有可能很有可能内存已被分配并随后被释放。所以你正在使用释放的内存。
  • static_cast 可以修改指针,并且您可以显式转换为 CMyObject 和隐式转换为 CMapStringToOb。检查直接从GetMap()返回的指针的有效性。

【讨论】:

    【解决方案3】:

    “魔法”发生的场景几乎总是会回到内存损坏。我怀疑您代码中的其他地方错误地修改了内存,这导致了这种特殊的行为。尝试测试输入这部分代码的一些不同方法。行为是否一致?

    这也可能是由错误构建的二进制文件引起的。尝试清理并重建您的项目。

    【讨论】:

    • 感谢大家的意见,但这个答案可能最接近解决问题。事实证明,我们依赖的另一个团队的项目套件没有正确构建,因此我们在代码中构建了不同的库版本。最后,重建和匹配所有引用和依赖关系解决了这个问题和其他几个问题。再次感谢所有评论和回答的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2014-12-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多