在Windows中,我使用CreateEvent或OpenEvent来使用事件对象,但是当我完成它时,我找不到删除对象的方法。我需要删除它吗?如果是这样,我该怎么做?
答案 0 :(得分:1)
不,您不需要来删除该活动。正如评论中提到的@deviantfan,您可以使用CloseHandle
表示您已完成对象,但没有必要这样做。来自MSDN CreateEvent
(强调我的):
使用CloseHandle函数关闭句柄。当进程终止时,系统会自动关闭句柄。 事件对象在其最后一个句柄关闭时被销毁。
答案 1 :(得分:1)
大多数内核对象(包括事件对象)都是引用计数的,因此不需要显式删除它们。关闭对象的最后一个句柄时,将自动删除该对象。
注意:
除了关闭句柄之外,无法强制删除内核对象。
句柄属于打开它们的进程,而不是线程。它们可以在任何线程中使用,如果打开它们的线程退出,它们不会自动关闭。
启动子进程时,子进程有一个选项可以继承父进程的句柄。如果启用此选项,那么在子项启动之前,您的进程在启动子进程时打开的任何内核对象都不会被删除。 (当然,除非孩子明确地关闭句柄;通常这是不可能的,因为孩子甚至不知道句柄存在。)
如果您需要子进程继承某些句柄,强烈建议您使用PROC_THREAD_ATTRIBUTE_HANDLE_LIST
选项,以便子级只继承您明确指定的句柄。例如,如果需要重定向标准输入和输出,则可以使用此选项。如果您并不特别需要继承任何句柄,请务必将FALSE
传递给bInheritHandles
参数。
如果您将在整个过程中使用对象,则无需关闭手柄;它将在进程终止时自动关闭,如果没有其他进程有句柄,则删除相应的对象。
作为一般规则的例外,只有在关闭所有句柄和相应的进程或线程退出后,才会删除进程对象和线程对象。