【发布时间】: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