当我的测试程序退出时,我正在努力解决一些调试断言。目的是通过使用Setup API获取磁盘驱动器的设备路径。我正在这样做。我遵循描述here for SetupDiGetDeviceInterfaceDetail的规则,即调用SetupDiGetDeviceInterfaceDetail()来确定结构所需的大小,并为结构分配内存并再次调用SetupDiGetDeviceInterfaceDetail()。
此过程有效,我正在获取所需的数据。什么不能正常工作,当程序退出,或者我直接删除内存时,我得到一个调试断言。断言窗口在第52行有找到问题的文件dbgdel.cpp。问题:“表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)”。
我不确定问题是什么。如果我删除了我正在使用的所有代码并且在没有所有Setup API调用的情况下新建了SP_DEVICE_INTERFACE_DETAIL_DATA对象,则对删除的调用起作用。基本上,这就是我正在做的事情:
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的定义。可以找到here。但是,它看起来像这样:
typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA {
DWORD cbSize;
TCHAR DevicePath[ANYSIZE_ARRAY];
} SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA;