Борьба с утверждениями отладки с помощью mem alloc для SP_DEVICE_INTERFACE_DETAIL_DATA - PullRequest
2 голосов
/ 23 февраля 2012

Я борюсь с некоторыми утверждениями отладки, когда моя тестовая программа завершается.Цель состоит в том, чтобы получить путь к устройству с помощью API установки.Это я делаю.Я следую описанному здесь правилу для SetupDiGetDeviceInterfaceDetail , то есть вызываю SetupDiGetDeviceInterfaceDetail (), чтобы определить размер, необходимый для структуры, и выделяю память для структуры, и снова вызываю SetupDiGetDeviceInterfaceDetail ().

Этопроцесс работает, и я получаю данные, которые мне нужны.Что не работает правильно, так это то, что когда программа закрывается или я удаляю память напрямую, я получаю отладочное утверждение.В окне подтверждения есть файл, в котором обнаружена проблема, dbgdel.cpp, в строке 52. Проблема: «Выражение: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)».

Я не уверен, в чем проблема,Если я удаляю весь код, который использую, и создаю новый объект SP_DEVICE_INTERFACE_DETAIL_DATA без всех вызовов 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...