合肥建站比较便宜的公司,中国建盏logo,如何做平台推广赚钱,工作证明模板 通用版句柄和指针都是一种数据结构#xff0c;都常用于访问内存#xff0c;下面介绍他们的一些不同点。
1 数据结构类型不同 指针的数据类型是无符号整数#xff0c;占用4或8个字节#xff08;在32位和64位系统中#xff09;#xff0c;它就像一个变量一样#xff0c;这个变量…句柄和指针都是一种数据结构都常用于访问内存下面介绍他们的一些不同点。
1 数据结构类型不同 指针的数据类型是无符号整数占用4或8个字节在32位和64位系统中它就像一个变量一样这个变量存储了一个地址 而句柄的数据类型实际上是一个结构体里面存储了数据类型、指向内容的地址和引用数等如下
typedef struct {void* ptr; // 指向实际数据对象的指针int type; // 所指数据结构的类型信息int refcnt; // 引用计数
} Handle;2 特点 由于指针可以直接访问内存中的数据因此它不具有任何保护机制随着指针的移动它可以任意访问或修改他所指向的数据结构这就导致它不太安全但是也正因为指针可以直接访问内存地址因此它也更加灵活高效。 句柄可以用来隐藏实际的内存地址保护内存中的数据结构防止非法访问这使句柄具备一定安全性。但使用句柄访问所指数据结构时需要通过”解引用“的方式这就使其访问需要更多时间和资源。
3 使用场景
在需要保护内存中的数据结构的情况下句柄比较合适在需要高效访问内存中的数据结构的情况下指针比较合适。
4 句柄补充
什么是”解引用“ 句柄的解引用是指通过句柄访问存储在句柄中的指针指向的数据。例如如果句柄中存储了一个指向字符串的指针那么解引用这个句柄将返回该字符串。 解引用怎么实现的 class Handle
{
public:Handle(int* data) : m_data(data) {}~Handle() { delete m_data; }int operator*() const { return *m_data; }private:int* m_data;
};int main()
{Handle h(new int(42));int value *h;std::cout value std::endl; // 输出42return 0;
}在上面的代码中Handle类封装了一个指向int类型数据的指针而operator*函数被用来实现句柄的解引用操作。当对句柄进行解引用时程序会返回指针所指向的int类型数据从而实现了句柄的解引用。 句柄中存的信息有什么用句柄怎么用 假设有一个名为“Handle”的结构体其中包含一个指向字符串的指针和一个引用计数。可以使用以下代码创建一个句柄 Handle* h new Handle(Hello); 这将创建一个指向包含字符串“Hello”的内存的指针并将其存储在句柄中。引用计数将设置为1。可以使用以下代码解引用句柄并访问该字符串这将打印出“Hello” std::cout *h std::endl; 可以使用以下代码增加句柄的引用计数 Handle* h2 h;h2-AddRef(); 现在引用计数为2因为有两个句柄引用同一块内存。可以使用以下代码减少引用计数 h-Release(); 现在引用计数为1因为只有一个句柄引用该内存。当所有句柄都被释放时该内存将被销毁。