C++中的VS2010调试器,“unused=???”的意思或“未使用=0”

Posted

技术标签:

【中文标题】C++中的VS2010调试器,“unused=???”的意思或“未使用=0”【英文标题】:VS2010 debugger in C++, meaning of "unused=???" or "unused=0" 【发布时间】:2012-06-27 14:00:09 【问题描述】:

在 Visual Studio 2010(C++,非托管)中调试,unused ???unused 0 的信息应该是什么意思?我附上了两张截图,child 是 HWND 到现有窗口。

我也很困惑,HWND 有时显示为“未使用”,有时显示为“0”。当有一个指向未分配内存的指针时,我会理解这种情况,但在我的特殊情况下,窗口已经创建并且有效。

【问题讨论】:

【参考方案1】:

这可以追溯到九十年代初,那时只有一个 HANDLE 作为类型来声明任何 Windows 对象的句柄。这是一个错误工厂,程序员可以摸索代码,例如,在需要窗口句柄的地方传递一个字体句柄。所以后来添加了 STRICT 宏,它重新声明了句柄类型,因此混合会产生编译器错误。在 winnt.h 中看起来像这样,针对内容进行了编辑:

#ifdef STRICT
   typedef void *HANDLE;
   #define DECLARE_HANDLE(name) struct name##__int unused;; typedef struct name##__ *name
#else
   typedef PVOID HANDLE;
   #define DECLARE_HANDLE(name) typedef HANDLE name
#endif

示例用法:

DECLARE_HANDLE(HWND);

struct 宏汤确保 HFONT 永远不会在 STRICT 开启时预期 HWND 的地方使用,它会在结构类型上产生类型不匹配。

您现在可以看到“未使用”的来源。它实际上没有被使用,只有 Windows 可以创建句柄值。它在调试器中很有帮助,因为它可以让您查看句柄值,0 或 -1 肯定是有问题的迹象。

this MSDN article 中有关 STRICT 的更多信息。

【讨论】:

你能补充一些关于0和-1的细节,这可能意味着什么麻烦?就我而言,我有时会看到问号,有时会看到 0,有时会看到其他数字。 +1 用于解释 STRICT。还想了解更多关于“0 或 -1 肯定是麻烦的迹象”。 它们是“不是句柄”值,表示你使用的任何winapi函数都失败了,你忘了检查错误。

以上是关于C++中的VS2010调试器,“unused=???”的意思或“未使用=0”的主要内容,如果未能解决你的问题,请参考以下文章

VS 2010 中的 C++ 调试访问冲突

vs2010调试c++总是说此项目已经过期怎么办

VS2010 模块列表中缺少 DLL

自定义 VS C++ 调试器 [重复]

vs2012调试时怎么查看堆中的数据(动态数组)? 求详细解答。 用的c++

为何刚装的vs2010 ,调试c++时显示 "此项目4 - Debug Win32已过期"?求大神帮忙!!