0

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

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

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

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

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

4

3 回答 3

5

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

于 2012-01-27T16:54:32.507 回答
3

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

  • 很有可能内存被分配并随后被释放。所以你正在使用释放的内存。
  • static_cast可以修改指针,并且您有一个显式转换为CMyObject和一个隐式转换为CMapStringToOb. 检查从 直接返回的指针的有效性GetMap()
于 2012-01-27T16:59:27.637 回答
2

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

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

于 2012-01-27T16:54:42.697 回答