1

这是关于正确使用 HANDLE 的一个非常基本的问题。给定以下代码(它不是特定的源文件):

typedef void* HANDLE;

HANDLE myHandle;

myHandle = SomeObject;

//...some elaborate code...//
  1. 第一个问题:myHandle 现在位于堆栈还是堆上?由于 Handle 既可以是指针也可以是索引,我对此不太确定。

    在 myHandle 超出范围时,它被删除(至少我认为是这样)。但是如果它是一个类成员,它会一直可见,直到拥有的对象被删除。所以第二个问题:

  2. 如果我想避免进一步访问 myHandle,这样做是一种好习惯吗

    myHandle = 0;  // I do not need this handle anymore
    

    我现在会遇到内存管理冲突,还是与托管代码有关的任何其他限制?是否有其他选项可以声明不应再使用此句柄,类似于指针:

    mypointer = NULL;
    

编辑:我首先谈论的是垃圾收集,这显然不包含在 c++ 中。这是托管扩展的一部分。感谢您帮助我解决这个致命错误!

4

3 回答 3

1

由于您没有指定HANDLE您在说什么,我假设 Windows 句柄。

AHANDLE是一种不透明的数据类型(主要表示操作系统可以使用的数字),只能由系统函数处理,例如CreateFileor CloseHandle

当您丢失相关资源时,您永远不应该自己设置HANDLEa 0

请参阅CloseHandleCreateFile(尤其是返回值)和Windows 数据类型

来自维基百科

在计算机编程中,句柄是对资源的抽象引用。当应用程序软件引用由另一个系统(例如数据库或操作系统)管理的内存块或对象时,将使用句柄。

虽然指针字面上包含它所引用的项目的地址,但句柄是外部管理的引用的抽象;它的不透明度允许系统将所指对象重新定位到内存中,而不会使句柄无效,这对于指针是不可能的。额外的间接层还增加了管理系统对在所指对象上执行的操作的控制。通常,句柄是指向全局墓碑数组的索引或指针。


而且 C++ 没有标准的垃圾收集,这就是为什么你需要自己删除newed 对象,而不是系统给出的句柄!

于 2013-06-19T08:14:13.440 回答
1

根据您所做的假设,您可能是一名 Java 程序员。

该变量myHandle确实是在堆栈上分配的,并且当它超出范围时会被删除,尽管不是由垃圾收集器(C++ 中不存在这样的东西)。

但是,这不会释放句柄(myHandle只是一个保存一些不透明数值的变量,实际的句柄由操作系统拥有——因此它的生命周期与任何持有该值的任意变量的生命周期不同)。您必须自己使用适当的 API 函数(对于大多数事情是 a HANDLE,这是CLoseHandle),最好使用“句柄持有者”类,这样它是异常安全的。

这种手柄支架的简单实现如下所示:

class AutoHandle
{
    HANDLE handle;
public:
    AutoHandle(HANDLE in) : handle(in) {}
    ~AutoHandle() { CloseHandle(handle); }
};

这样,您在打开资源时分配给 AutoHandle 变量,当它超出范围时,句柄将关闭。你不能忘记这样做,即使发生异常它也会起作用。

于 2013-06-19T08:17:35.840 回答
0

通常更喜欢在将指针指向 NULL 之前使用 delete。

但是对于 HANDLER,不要自己把它设为 NULL !

于 2013-06-19T08:17:28.247 回答