使用DeviceIoControl
调用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
时,会使用指向某些数据(VOLUME_DISK_EXTENTS
数组)的指针填充Extents
结构。虽然我的代码中创建的结构被我释放,但是一系列指针似乎令人不安。
我应该释放那段记忆吗? 我如何释放它?
答案 0 :(得分:1)
唯一涉及的指针是指向缓冲区的指针,该缓冲区传递给DeviceIoControl()
,以便填充VOLUME_DISK_EXTENTS
结构的内容。 VOLUME_DISK_EXTENTS
内部没有指针,其Extents
成员是一个扁平的结构数组,而不是一个指针数组。这些结构完全包含在您分配的缓冲区中。所以唯一需要释放的是你的缓冲区,没有别的。
答案 1 :(得分:0)
实际上VOLUME_DISK_EXTENTS
被定义为存储1个项目。
typedef struct _VOLUME_DISK_EXTENTS {
DWORD NumberOfDiskExtents;
DISK_EXTENT Extents[ANYSIZE_ARRAY]; // ANYSIZE_ARRAY == 1
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;
如果我们按以下方式致电DeviceIoControl
VOLUME_DISK_EXTENTS vde;
ret = DeviceIoControl(
h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL
);
我们将获得ERROR_MORE_DATA
返回代码,因为该结构中没有足够的空间。 Extents
数组的大小定义为1,如果您尝试访问1及以上的元素,则会在VOLUME_DISK_EXTENTS
结构之后进入缓冲区中的空间。所以我们真正需要的是创建一个VOLUME_DISK_EXTENTS
而不是一个大小
sizeof(DISK_EXTENT) * (nextents - 1) + sizeof(VOLUME_DISK_EXTENTS)
其中nextents
是我们从上一次调用获得的VOLUME_DISK_EXTENTS::NumberOfDiskExtents
值。然后我们应该使用
VOLUME_DISK_EXTENTS *ext = (VOLUME_DISK_EXTENTS*) buff;
并使用此结构,假设Extents
数组包含nextents
个元素。
不需要额外的API调用来释放内存。释放的一切都是缓冲。