问题描述
假设您正在使用 I/O 完成端口执行异步操作(如 ReadDirectoryChangesW
)。对于每次调用该函数,您分配一个 OVERLAPPED
结构(可能带有一些附加数据)以在 I/O 完成回调中使用。然后在回调中,在使用 OVERLAPPED
结构后,您使用作为参数提供的指针释放内存。
现在让我们说是时候关闭一切并取消任何挂起的异步调用了。是否有可以调用的函数来检索指向任何当前挂起的 I/O 操作中使用的 OVERLAPPED
结构的指针,以便您可以释放内存?
解决方法
是否有可以调用的函数来检索指向任何当前挂起的 I/O 操作中使用的 OVERLAPPED 结构的指针
不,没有。您有责任跟踪分配的 OVERLAPPED
。
但是,当您取消异步 I/O 操作时,您仍然会收到它的完成通知,表明请求的操作已中止。因此,如果您只是简单地分配 OVERLAPPED
并将它们传递给 IOCP 而没有跟踪它们,那么您可以像往常一样继续在通知处理程序中释放它们的内存。在您收到每个待处理的 I/O 操作的完成通知之前,不要完全关闭。