当我的测试程序退出时,我正在努力处理一些调试断言。目的是通过使用 Setup API 获取磁盘驱动器的设备路径。这是我正在做的。我遵循此处为 SetupDiGetDeviceInterfaceDetail描述的规则,即调用 SetupDiGetDeviceInterfaceDetail() 以确定结构所需的大小,并为结构分配内存并再次调用 SetupDiGetDeviceInterfaceDetail()。
这个过程有效,我得到了我需要的数据。不能正常工作的是,当程序退出时,或者我直接删除内存时,我得到了一个调试断言。断言窗口在第 52 行包含发现问题的文件 dbgdel.cpp。问题:“表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)”。
我不确定问题是什么。如果我删除我正在使用的所有代码并新建一个 SP_DEVICE_INTERFACE_DETAIL_DATA 对象,而没有所有 Setup API 调用,则删除调用有效。基本上,这就是我正在做的事情:
HDEVINFO hDevs = SetupDiGetClassDevs(&DiskClassGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
SP_DEVICE_INTERFACE_DATA devInterfaceData = {sizeof(SP_DEVICE_INTERFACE_DATA)};
DWORD size(0);
SetupDiEnumDeviceInterfaces(hDevs, NULL, &DiskClassGuid, 0, &devInterfaceData);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetails(NULL);
SetupDiGetDeviceInterfaceDetail(hDevs, &devInterfaceData, pDetails, 0, &size, NULL);
pDetails = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new BYTE[sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + size]);
// zero allocated memory
pDetails->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SetupDiGetDeviceInterfaceDetail(hDevs, &devInterfaceData, pDetails, size, NULL, NULL);
delete[] pDetails;
当程序退出或调用 delete[] 时,前面提到的断言就会出现。请向我解释我做错了什么。
谢谢,安迪
更新:忘记添加 SP_DEVICE_INTERFACE_DETAIL_DATA 的定义。可以在这里找到。但是,它看起来像这样:
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA {
DWORD cbSize;
TCHAR DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA;