当前位置: 首页 > news >正文

句柄和指针的区别

句柄和指针都是一种数据结构,都常用于访问内存,下面介绍他们的一些不同点。

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,因为只有一个句柄引用该内存。当所有句柄都被释放时,该内存将被销毁。

http://www.lryc.cn/news/45219.html

相关文章:

  • Linux 网络编程学习笔记——十四、多线程编程
  • JS 获取时区
  • 【0183】PG内核客户端认证之将读取的token创建HbaToken(3 - 1)
  • 别把 OpenAI 太当回事,它远未达到替换前端的地步
  • 前端基础HTML、CSS--8(CSS-5)
  • 基于ASP网络办公OA系统的设计与实现
  • C语言计算机二级/C语言期末考试 刷题(五)
  • 2023-04-03 grafana-源码编译启动及添加prometheus数据源
  • 微软New Bing(GPT-4)写的Delphi诗歌
  • 【进程地址空间】
  • 递归dfs入门
  • 华为OD机试用java实现 -【吃火锅】
  • AI创作优美文章的秘密大揭秘!
  • SpringMVC的拦截器
  • dolphinscheduler-3.1.4
  • 大前端05-用vue轻量级第三方组件库快速创建个画板,可以支持画板、直线、圆形等输入,可以撤回,改变颜色
  • ChatGPT使用案例之生成PPT
  • ChatGPT基础知识系列之模型介绍
  • ChatGPT助力软件开发
  • 这些关于高压放大器的常识,你知道多少?(二)
  • 使用神经网络中的卷积核生成语谱图
  • 文章五:Python 网络爬虫实战:使用 Beautiful Soup 和 Requests 抓取网页数据
  • 【大数据之Hadoop】八、MapReduce之序列化
  • Python网络爬虫之Selenium详解
  • 中睿天下受邀出席电促会第五次会员代表大会
  • Chat GPT:软件测试人员的危机?
  • 【Redis】高可用:Redis的主从复制是怎么实现的?
  • WLAN速度突然变慢
  • GDAL python教程基础篇(12)GDAL和 Pillow 的互操作
  • 快速学习java路线建议