C++ 2

结构体和类的区别

  1. struct 只能包含成员变量,不能包含成员函数。而在 C++ 中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。
  2. 不同点:
    ● class 中的成员默认都是 private 的,而 struct 中的成员默认都是 public 的;
    ● class 继承默认是 private,struct 继承默认是 public;
    ● class 可以用于定义模板函数,而 struct 不行。
    ● 实际使用中,struct 我们通常用来定义一些 POD(plain old data) 类型,它是用来描述一种数据类型的特性,主要用于在内存中表示简单的数据结构。

什么是智能指针,C++有哪几种智能指针

智能指针是C++中用来自动管理动态分配内存的一种模板类,维护着一个指向动态分配对象的指针,并在智能指针对象被销毁时,自动释放该内存,从而避免内存泄漏。
C++有以下几种智能指针:
● std::unique_ptr:独占式拥有指针,保证同一时间只有一个unique_ptr指向特定内存,适用于不需要共享所有权的场景,如栈上对象的管理。
● std::shared_ptr:多个shared_ptr可以共享同一内存,使用引用计数机制来管理内存的生命周期,适用于多个对象需要共享同一个资源的场景。
● std::weak_ptr:弱引用,用于解决shared_ptr可能导致的循环引用问题,它不拥有所指向的对象。

智能指针的实现原理是什么

  1. std::unique_ptr
    ○ unique_ptr代表独占所有权的智能指针,同一时间只能有一个unique_ptr实例指向特定资源。
    ○ 它通过析构函数来管理资源的释放。当unique_ptr超出作用域时,会自动调用删除操作符来释放其指向的内存。
    ○ std::unique_ptr 通过删除复制构造函数和复制赋值运算符来确保所有权的唯一性,但提供移动构造函数和移动赋值运算符,允许所有权的转移。
  2. std::shared_ptr
    ○ shared_ptr允许多个指针实例共享对同一资源的所有权,使用引用计数机制来跟踪有多少个shared_ptr指向同一资源。
    ○ 内部维护一个控制块,通常包含引用计数和资源的原始指针。每当创建一个新的shared_ptr或将一个shared_ptr赋值给另一个时,引用计数增加。
    ○ 当shared_ptr被销毁或通过标准库提供的reset成员函数重置时,引用计数减少。当引用计数降到零时,控制块会释放资源并自我销毁。
  3. std::weak_ptr
    ○ std::weak_ptr 是一种不拥有对象的智能指针,它观察 std::shared_ptr 管理的对象,但不增加引用计数。
    ○ 它用于解决 std::shared_ptr 之间可能产生的循环引用问题,因为循环引用会导致引用计数永远不会达到零,从而造成内存泄漏。

new和molloc有什么区别

new和malloc在C++中都用于动态内存分配,但它们之间有几个关键的区别:

  1. 语法层面:
    ○ new是C++的操作符,可以直接用来分配对象或数组。
    ○ malloc是一个函数,通常需要包含头文件,并且只分配原始内存。
  2. 类型安全:
    ○ new是类型安全的,它会根据分配的对象类型进行正确的内存分配和构造函数调用。
    ○ malloc 不是类型安全的,它只分配原始内存,不调用构造函数。返回类型是 void*,需要强制类型转换为具体的指针类型。
  3. 构造与析构:
    ○ 使用 new 分配的对象在对象生命周期结束时需要使用 delete 来释放,delete 会自动调用对象的析构函数。
    ○ 使用 malloc 分配的内存需要使用 free 来释放,free 不会自动调用析构函数,因此如果分配的是对象数组,需要手动调用析构函数。
  4. 异常安全性:
    ○ new在分配失败时会抛出std::bad_alloc异常。
    ○ malloc在分配失败时返回NULL指针。
  5. 管理机制:
    ○ C++中的new和delete通常由编译器实现,可能包含一些额外的内存管理机制。
    ○ C语言的malloc和free由C标准库提供,与编译器无关。
    总结来说,new和malloc都是动态内存分配的手段,但new提供了类型安全和构造/析构的自动化,而malloc则提供了更底层的内存分配方式,需要手动管理构造和析构。在C++中,推荐使用new来分配对象,以保持类型安全和自动化的资源管理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中使用unzip

安装命令 yum install unzip unzip常用选项和参数 选项 说明 -q 隐藏解压过程中的消息输出 -d /path/to/directory 指定解压文件的目标目录 -P password 如果.zip文件被密码保护,使用此选项可以指定打开文件所需的密码 解压命令 unzip 要解压的压缩包unz…

ThreadLocal源码解析

文章目录 一、概述二、get()方法三、set()方法四、可能导致的内存泄漏问题五、remove六、思考:为什么要将ThreadLocalMap的value设置为强引用? 一、概述 ThreadLocal是线程私有的,独立初始化的变量副本。存放在和线程进行绑定的ThreadLocalMa…

批量解密,再也没有任何限制了

有的时候我们在网上下载了PDF文档。发现没有办法进行任何的操作,就连打印权限都没有。今天给大家介绍的这个软件可以一键帮你进行PDF解密,非常方便,完全免费。 PDF智能助手 批量解密PDF文件 这个软件不是很大,只有10MB&#xff…

《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

车载软件 --- 大一新生入门汽车零部件嵌入式开发

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…

有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

【深度优先搜索篇】走迷宫的魔法:算法如何破解迷宫的神秘密码

当你在夜晚孤军奋战时,满天星光以为你而闪烁。 欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:轻轻松松拿捏洛谷走迷宫问题 制作日期:2024.12.31 隶属专栏:C/C题海汇总 首先我…

SQL进阶实战技巧:如何分析浏览到下单各步骤转化率及流失用户数?

目录 0 问题描述 1 数据准备 2 问题分析 3 问题拓展 3.1 跳出率计算 3.2 计算从浏览商品到支付订单的不同路径的用户数,并按照用户数降序排列。 往期精彩 0 问题描述 统计从浏览商品到最终下单的各个步骤的用户数和流失用户数,并计算转化率 用户表结构和…

Autosar-Os是怎么运行的?(内存保护)

写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.功能概述 以TC397芯片为例,英飞凌芯片集成了MPU模块, MPU模块采用了硬件机…

什么是Maxscript?为什么要学习Maxscript?

MAXScript是Autodesk 3ds Max的内置脚本语言,它是一种与3dsMax对话并使3dsMax执行某些操作的编程语言。它是一种脚本语言,这意味着您不需要编译代码即可运行。通过使用一系列基于文本的命令而不是使用UI操作,您可以完成许多使用UI操作无法完成的任务。 Maxscript是一种专有…

(一)QT的简介与环境配置WIN11

目录 一、QT的概述 二、QT的下载 三、简单编程 常用快捷键 一、QT的概述 简介 Qt(发音:[kjuːt],类似“cute”)是一个跨平台的开发库,主要用于开发图形用户界面(GUI)应用程序,…

vim交换文件的作用

1.数据恢复:因为vim异常的退出,使用交换文件可以恢复之前的修改内容。 2.防止多人同时编辑:vim检测到交换文件的存在,会给出提示,以避免一个文件同时被多人编辑。 (vim交换文件的工作原理:vim交换文件的工作…

SpringCloudGateWay和Sentinel结合做黑白名单来源控制

假设我们的分布式项目,admin是8087,gateway是8088,consumer是8086 我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目,那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以&#xff1…

将多目标贝叶斯优化与强化学习相结合用于TinyML

论文标题 Combining Multi-Objective Bayesian Optimization with Reinforcement Learning for TinyML 作者信息 Mark Deutel, Friedrich-Alexander-Universitt Erlangen-Nrnberg, Germany Georgios Kontes, Fraunhofer IIS, Fraunhofer Institute for Integrated Circuits …

Big Bird:适用于更长序列的Transformer模型

摘要 基于Transformer的模型,如BERT,已成为自然语言处理(NLP)中最成功的深度学习模型之一。然而,它们的一个核心限制是由于其全注意力机制,对序列长度的二次依赖(主要是在内存方面)…

26_DropDown使用方法

创建下拉框DropDown 其中样板Template 是展示的选项框 其中Caption 是选中某个选项之后 展示的内容(Caption Text 说明文字/Caption Image 说明图示) 修改其 说明文字Caption Text 创建一个说明图示Image 设置为居左 而Item是 展示的选项框所展示的文字与…

【redis进阶】redis 总结

目录 介绍一下什么是 Redis,有什么特点 Redis 支持哪些数据类型 Redis 数据类型底层的数据结构/编码方式是什么 ZSet 为什么使用跳表,而不是使用红黑树来实现 Redis 的常见应用场景有哪些 怎样测试 Redis 服务器的连通性 如何设置 key 的过期时间 Redis …

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型,用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说,N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意:这…

Linux工具使用

1.gcc/g的使用 1.1程序翻译的过程 ①预处理:展开头文件,替换宏,调节编译,去注释。 ②编译:将代码变成汇编语言 ③汇编:将汇编代码变成二进制不可执行的目标文件。 ④链接:将多个我写的多个…

后端token校验流程

获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址,在IDEA中查找 这里是getInfo函数的声明,我们要找到这个函数的使用,所以点getInfo() Override public JSONObject getInfo() {JSO…