我遇到异常并在观察窗口中查看变量,我看到了一些问号(???)。这是否意味着它指向无效的地址?
答案 0 :(得分:6)
这意味着调试器无法确定其值。
例如,如果您的代码涉及HWND
,您会看到相当多的内容。如果您查看Windows头文件,它通过宏定义如下:
struct HWND__{int unused;}; typedef struct HWND__ *HWND;
因此HWND
的类型实际上是“指向HWND__
”的类型。但是,从HWND
等函数获得的CreateWindow()
值实际上并不是指向任何内容的指针。
但调试器会尝试计算结构中unused
成员的值,但不能这样做:
当观察到的变量包含错误或缺少的类型信息时,您还会看到这些类型的错误。
答案 1 :(得分:1)
这是一个C ++风格的项目吗?
调试器通常使用“???”当字符串能够计算表达式但无法获取显示的特定部分的任何类型信息时。这通常是因为缺少或不正确的PDB符号而发生的。
如果表达式正在访问损坏的数据(overriten virtual tables或RTTI),则可能会出现这种情况。但我不是100%知道这是否属实。
答案 2 :(得分:1)
通常它意味着指针或引用指向不可访问的内存,因此无法获取要呈现的值。例如,如果你有一个指向Foo的指针,调试器通常会将指针指向的位解释为Foo - 指针是否有效。但在某些情况下,野指针可能指向甚至没有在进程空间中映射的位置。在这种情况下,调试器无法获取位。