C++之优化Linux内核结构体用智能指针std::unique_ptr与std::make_unique分配内存总结(二百六十五)

news2024/11/22 20:50:37

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之结构体使用智能指针std::unique_ptr与std::make_unique分配内存总结

2.结构体使用智能指针std::unique_ptr与std::make_unique分配内存介绍

  • 在C++中,结构体(struct)是一种用户定义的数据类型,它允许我们组合多个不同类型的数据项,形成一个单一的复合数据类型。当结构体中包含动态分配的内存时,管理这些内存就变得尤为重要。std::unique_ptr和std::make_unique是C++11引入的两个智能指针工具,它们能够帮助我们自动管理这些动态分配的内存。

  • 使用std::unique_ptr管理结构体内存

  • std::unique_ptr是一个独占所有权的智能指针,当指向的结构体不再需要时,unique_ptr会自动删除它,从而避免了手动调用delete的繁琐和潜在的内存泄漏问题。

  • 下面是一个例子,展示如何使用std::unique_ptr来管理结构体的内存:

struct MyStruct {  
    int x;  
    double y;  
    // 其他成员...  
};  
  
int main() {  
    // 使用std::unique_ptr动态分配MyStruct对象  
    std::unique_ptr<MyStruct> ptr(new MyStruct{42, 3.14});  
  
    // 使用ptr  
    std::cout << ptr->x << ", " << ptr->y << std::endl;  
  
    // 当ptr离开作用域时,它所指向的MyStruct对象会被自动删除  
    // 不需要手动调用delete  
}
  • 使用std::make_unique分配结构体内存std::make_unique是一个函数模板,它用于创建一个std::unique_ptr实例,并自动分配内存。使用make_unique更加安全,因为它避免了直接使用new可能引发的异常安全性问题。

  • 以下是如何使用std::make_unique来分配结构体的内存:

struct MyStruct {  
    int x;  
    double y;  
    // 其他成员...  
};  
  
int main() {  
    // 使用std::make_unique创建指向MyStruct的unique_ptr  
    auto ptr = std::make_unique<MyStruct>(42, 3.14);  
  
    // 使用ptr  
    std::cout << ptr->x << ", " << ptr->y << std::endl;  
  
    // 当ptr离开作用域时,它所指向的MyStruct对象会被自动删除  
}
  • 在这个例子中,我们假设MyStruct有一个接受两个参数的构造函数。std::make_unique直接调用这个构造函数来初始化MyStruct对象,并返回一个指向该对象的unique_ptr。

  • 通过使用std::unique_ptr和std::make_unique,我们可以确保结构体的内存得到正确的管理,避免了手动管理内存所带来的风险和复杂性。这是现代C++编程中推荐的内存管理实践之一。

3.代码实例

<1>.v1.0 非智能指针版本

#include <iostream>
#include <memory>
#include <string>

struct file {
  void *private_data;
};

struct binder_context {
  int binder_context_mgr_node;
  const char *name;
};

struct binder_proc {
  int proc;
  struct binder_context *context;
};

static int binder_ioctl_set_ctx_mgr(struct file *filp){
  struct binder_proc *proc = (struct binder_proc *)filp->private_data;
  struct binder_context *context = proc->context;

  context->binder_context_mgr_node = 33;
  printf("xxx--------------->%s(), line = %d, binder_context_mgr_node = %d\n",__FUNCTION__,__LINE__,proc->context->binder_context_mgr_node);
  return 0;
}

int main(){
  struct file *filp;
  struct binder_proc *proc = (struct binder_proc*)malloc(sizeof(struct binder_proc));
  proc->context = (struct binder_context*)malloc(sizeof(struct binder_context));
  proc->context->binder_context_mgr_node = -1;

  //1.初始化结构体struct file
  filp = (struct file*)malloc(sizeof(struct file));
  // 使用 std::unique_ptr 来动态分配内存
  //std::unique_ptr<struct file> filp = std::make_unique<struct file>();
  filp->private_data = proc;

  //2.
  binder_ioctl_set_ctx_mgr(filp);
  printf("xxx--------------->%s(), line = %d, binder_context_mgr_node = %d\n",__FUNCTION__,__LINE__,((struct binder_proc *)(filp->private_data))->context->binder_context_mgr_node);
  free(proc->context);
  free(proc);
}

<2>.v2.0 智能指针版本

#include <iostream>
#include <memory>
#include <string>

struct file {
  void* private_data;
};

struct binder_context {
  int binder_context_mgr_node;
  const char* name;
};

struct binder_proc {
  int proc;
  std::unique_ptr<binder_context> context; // 使用 std::unique_ptr 管理内存
};

static int binder_ioctl_set_ctx_mgr(file* filp) {
  binder_proc* proc = static_cast<binder_proc*>(filp->private_data);
  binder_context* context = proc->context.get(); // 获取原始指针
  context->binder_context_mgr_node = 33;

  printf("xxx--------------->%s(), line = %d, binder_context_mgr_node = %d\n",__FUNCTION__,__LINE__,proc->context->binder_context_mgr_node);
  return 0;
}

int main() {
  //v1.0
  //auto filp = std::make_unique<file>();

  //v2.0
  //std::unique_ptr<struct file> filp(new file()); // 使用 std::unique_ptr 管理内存

  //v3.0
  //std::unique_ptr<struct file> filp(std::make_unique<file>());

  //v4.0
  //std::unique_ptr<struct file> filp = std::make_unique<file>();

  //v5.0
  std::unique_ptr<struct file> filp = std::make_unique<struct file>();

  //std::unique_ptr<binder_proc> proc(new binder_proc());
  std::unique_ptr<binder_proc> proc = std::make_unique<struct binder_proc>();

  proc->context = std::make_unique<binder_context>(); // 使用 std::make_unique 分配内存
  proc->context->binder_context_mgr_node = -1;

  filp->private_data = proc.get();

  binder_ioctl_set_ctx_mgr(filp.get());
  printf("xxx--------------->%s(), line = %d, binder_context_mgr_node = %d\n",__FUNCTION__,__LINE__,static_cast<binder_proc*>(filp->private_data)->context->binder_context_mgr_node);

  // 不需要显式调用 delete,因为智能指针会在超出作用域时自动释放内存
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自贡市第一人民医院:超融合与 SKS 承载 HIS 等核心业务应用,加速国产化与云原生转型

自贡市第一人民医院始建于 1908 年&#xff0c;现已发展成为集医疗、科研、教学、预防、公共卫生应急处置为一体的三级甲等综合公立医院。医院建有“全国综合医院中医药工作示范单位”等 8 个国家级基地&#xff0c;建成高级卒中中心、胸痛中心等 6 个国家级中心。医院日门诊量…

Linux (Ubuntu)- mysql8 部署

1.基本部署 01》》先查看OS类型&#xff0c;如果是Ubuntu在往下边看 rootspray:/etc/mysql/mysql.conf.d# lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: …

Movavi Video Converter 2022 for Mac/Win:卓越的视频音频文件转换器

在数字化时代&#xff0c;视频和音频文件已成为我们日常生活和工作中不可或缺的一部分。无论是制作精美的家庭影片&#xff0c;还是编辑专业的商业视频&#xff0c;一款高效、便捷的视频音频文件转换器无疑是您的得力助手。而Movavi Video Converter 2022&#xff0c;就是这样一…

GPT 模型解析:ChatGPT 如何在语言处理领域引领潮流?

人工智能时代来临 我们正处于AI的iPhone时刻。——黄仁勋&#xff08;英伟达CEO&#xff09; ChatGPT 好得有点可怕了&#xff0c;我们距离危险的强人工智能不远了。——马斯克&#xff08;Tesla/SpaceX/Twitter CEO&#xff09; 以上的内容说明我们现在正处于一个技术大翻牌的…

测斜仪在边坡安全监测中的重要作用

边坡作为土木工程和地质工程领域中常见的结构形式&#xff0c;其稳定性直接关系到工程安全以及人民生命财产的安全。因此&#xff0c;对边坡进行精确、及时的监测是至关重要的。在众多边坡监测仪器中&#xff0c;测斜仪以其独特的优势在边坡安全监测中发挥着重要的作用。 测斜仪…

(24年4月2日更新)Linux安装chrome及chromedriver(Ubuntu20.0416.04)

一、安装Chrome 1&#xff09;先执行命令下载chrome&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb2&#xff09;安装chrome sudo dpkg -i google-chrome-stable_current_amd64.deb踩坑&#xff1a;这里会提示如下报错&…

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考…

大数据实验一,Hadoop安装及使用

目录 一&#xff0e;实验内容 二&#xff0e;实验目的 三&#xff0e;实验过程截图及说明 1、安装SSH&#xff0c;并配置SSH无密码登录 2、配置java环境 3.Hadoop的安装与配置 4、修改四个配置文件&#xff1a; 5、格式化HDFS的NameNode&#xff1a; 6、启动Hadoop 7、…

springcloud基本使用五(Gateway服务网关)

为什么使用网关&#xff1f; 权限控制&#xff1a;网关作为微服务入口&#xff0c;需要校验用户是是否有请求资格&#xff0c;如果没有则进行拦截。 路由和负载均衡&#xff1a;一切请求都必须先经过gateway&#xff0c;但网关不处理业务&#xff0c;而是根据某种规则&#xff…

[NSSRound#8 Basic]MyPage

[NSSRound#8 Basic]MyPage 打开页面后什么都没有 尝试使用php伪协议 //读取文件源码 filephp://filter/readconvert.base64-encode/resourceindex.php 显示&#xff1a;空白一片 filephp://filter/readconvert.base64-encode/resource/var/www/html/index.php 显示&#xff1…

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?

C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成&#xff1f; 手术麻醉系统与医院信息系统的集成是一个关键步骤&#xff0c;它有助于实现信息的共享和流程的协同&#xff0c;从而提高医疗服务的效率和质量。手麻系统与lis、his、pacs等系统的对接是医院信息化建设的重…

00150金融理论与实务考试分析

1.考试时间及题型 2.历年真题分析—单选题 3.历年真题分析—多选题

Redis windows设置自动开启服务

查看服务 WinR后输入services.msc进入到服务管理页面&#xff0c;查看是否存在Redis服务。 Windows版Redis解压后&#xff0c;是不会在服务中显示的&#xff0c;需要手动配置后才能在服务中看到 配置服务 在解压的Redis版本目录下&#xff0c;输入CMD&#xff0c;运行命…

使用阿里云试用Elasticsearch学习:1.1 基础入门——入门实践

阿里云试用一个月&#xff1a;https://help.aliyun.com/search/?kelastic&sceneall&page1 官网试用十五天&#xff1a;https://www.elastic.co/cn/cloud/cloud-trial-overview Elasticsearch中文文档&#xff1a;https://www.elastic.co/guide/cn/elasticsearch/guide…

Python PDF页面设置 -- 旋转页面、调整页面顺序

在将纸质文档扫描成PDF电子文档时&#xff0c;有时可能会出现页面方向翻转或者页面顺序混乱的情况。为了确保更好地浏览和查看PDF文件&#xff0c;本文将分享一个使用Python来旋转PDF页面或者调整PDF页面顺序的解决方案。 目录 使用Python旋转PDF页面 使用Python调整PDF页面…

RISC-V GNU Toolchain 工具链安装问题解决(含 stdio.h 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

Docker、Kubernetes之间的区别

比较容器化工具&#xff1a;了解 Docker、Kubernetes 在应用程序部署和管理方面的差异。 基本概述 Docker 是一个流行的容器化平台&#xff0c;允许开发人员在容器中创建、部署和运行应用程序。 Docker 提供了一组工具和 API&#xff0c;使开发人员能够构建和管理容器化应用程…

C++算法补充---STL

这里写目录标题 CSTL容器字符串函数(string容器函数)字符串转字符 算法交换函数拿到容器或者数组的第一个最大&#xff08;小&#xff09;值元素的下标或者值排序函数求字符数组的有效长度atoi函数&#xff08;将字符串类型的数字转为真正的int型数字&#xff09;string转字符 …

代码随想录算法训练营三刷day42 | 动态规划之背包问题 416. 分割等和子集

三刷day42 416. 分割等和子集确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 416. 分割等和子集 题目链接 解题思路&#xff1a; 这是一维的背包问题 只有确定了如下四点&#xff0c;才能把01背包问题套到本题上来。 背包的体积为sum / 2背…

vscode shadertoy插件,非常方便的glsl着色器编写工具

很著名的shadertoy网站&#xff0c;集合了非常多大神利用数学写出美妙的shader效果。像shadertoy创始人之一的IQ大神它在这方面有很多的建树。他的利用光线步进和躁声可以创建很多不可思议的3D场景。 vscode有一件shadertoy的插件&#xff0c;安装后可以新建一个*.glsl文件&am…