【C++ 面试 - 新特性】每日 3 题(三)

news2024/12/23 8:32:08

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

7. 智能指针是线程安全的吗?如何保证线程安全?

不是。C++ 中的智能指针,例如 std::shared_ptr 和 std::unique_ptr,本质上是一种封装了指针的数据类型,它们管理对象的生命周期,并确保在不再需要时自动释放资源。但是,这些智能指针本身不具有线程安全特性。如果多个线程同时访问同一个智能指针,则需要使用额外的同步机制 (例如锁) 来保证它们的正确性。
为了确保智能指针的线程安全性,可以结合使用互斥锁或原子操作来保护对智能指针的访问。下面是一个具体的示例:

#include <iostream>
#include <mutex>
#include <memory>
#include <thread>
std::mutex mtx;
void modifySharedPointer(std::shared_ptr<int>& sp) {
    std::unique_lock<std::mutex> lock(mtx);
    // 对智能指针进行修改操作
    *sp += 1;
}
void accessSharedPointer(const std::shared_ptr<int>& sp) {
    std::unique_lock<std::mutex> lock(mtx);
    // 对智能指针进行读取操作
    std::cout << "Value: " << *sp << std::endl;
}
int main() {
    std::shared_ptr<int> sp = std::make_shared<int>(0);
    std::thread t1(modifySharedPointer, std::ref(sp));
    std::thread t2(accessSharedPointer, std::ref(sp));
    t1.join();
    t2.join();
    return 0;
}

在以上示例中,我们使用了一个互斥锁 std::mutex 来保护对智能指针的读写操作。通过 std::unique_lock 创建的锁对象,在访问智能指针时会自动加锁,并在适当的时候释放锁。
这样就能确保多个线程在访问智能指针时的互斥性,从而保证线程安全性。

8. 智能指针如何自定义删除器

template<typename T>
class MyDeletor
{
public:
    void operator()(T* ptr)const
    {
        cout<<"call MyDeletor.operator()"<<endl;
        delete[]ptr;
    }
};

template<typename T>
class MyFileDeletor
{
public:
    void operator()(T* ptr)const
    {
        cout<<"call MyFileDeletor.operator()"<<endl;
        fclose(ptr);
    }
};

int main()
{
    unique_ptr<int, MyDeletor<int>> ptr1(new int[100]); // delete []ptr1
    unique_ptr<FILE, MyFILEDeletor<FILE>> ptr2(fopen("data.txt", "w"));
    
    return 0;
}

上面的写法一个不好的地方就是 class 自定义删除类万一只用一次,那就挺占空间的,代码就需要一直放到上面,有多少不同的类型就要写多少自定义删除类。所以我们可以改成用 lambda 表达式的形式:

unique_ptr<int, function<void(int*)>> ptr1(new int[100], [](int* p)->void){
    cout<<"call lambda release new int[100]"<<endl;
    delete[]p;
};

unique_ptr<FILE, function<void(FILE*)>> ptr2(fopen("data.txt", "w"), [](FILE* p)->void){
    cout<<"call lambda release new fopen"<<endl;
    fclose(p);
};

9. make_shared 的实现原理

make_shared 先会调用 std::allocate_shared 来分配内存,然后再调用构造函数。它和直接用 new 赋值给智能指针的区别在于,直接 new 需要创建两次内存,new 的时候分配一次内存,然后构建智能指针时又会分配一次内存,这可能会增加内存碎片。而 make_shared 就将这两次内存分配减少到了一次,提高了效率。
例如:

shared_ptr<int> sp1(new int(10));

按照上面这样初始化可能会存在缺陷,因为底层需要分配两块内存,如果其中一块申请成功而另一块申请失败,那么资源就会泄漏。
在这里插入图片描述

shared_ptr<int> sp2 = make_shared<int>(10);

如果用 make_shared 来进行初始化,则它会将两块内存合并在一起生成,即只分配了一次内存。如果不使用make_shared,当 new int 时候成功,但是 new _Ref_count_base 失败时,share_ptr 在构造时失败,无法调用析构函数,导致 new int 的内存无法释放;
在这里插入图片描述
缺点:

  1. make_shared 不能自定义删除器.
  2. 导致托管的资源延迟释放,即使强智能指针引用计数减为 0,但是弱智能指针仍有计数则资源不能释放,因为都在同一块内存,要释放会一起释放。

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

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

相关文章

RPKI应急管控网络拓扑搭建

应急管控网络拓扑搭建 一、网络拓扑图 二、拓扑配置 1.资源库批量导入roas 在rpki.qcl.edu.cn服务器上的/usr/local/rpki/目录下执行脚本 sh roa_get.sh add#!/bin/dash# TODO Aadd Rremove start10000 sum254 run(){for i in seq 1 20dofor j in seq 1 250doas_numberexpr…

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上

文章目录 一、原理分析1.1 对于IMX6ULL的IO初始化1.2 IO的复用&#xff08;MUX&#xff09;1.3 电气属性寄存器&#xff08;PAD&#xff09;1.3.1 SRE(bit0)1.3.2 DSE(bit5:3)1.3.3 SPEED(bit7:6)1.3.4 ODE(bit11)1.3.5 PKE(bit12)1.3.6 PUE(bit13)1.3.7 PUS(bit15:14)1.3.8 HY…

6.5椒盐噪声

在OpenCV中联合C给一张图片加上椒盐噪声&#xff08;Salt and Pepper Noise&#xff09;可以通过随机选择像素点并将其置为黑色&#xff08;0&#xff09;或白色&#xff08;255&#xff09;来实现。椒盐噪声是一种随机噪声&#xff0c;通常表现为图像中的孤立黑点&#xff08;…

Windows环境下 VS2022 编译 LAME 源码

LAME LAME 是一个非常流行的开源 MP3 编码器库&#xff0c;它的全称是 “LAME Ain’t an MP3 Encoder”&#xff0c;这是一个带有讽刺意味的名字&#xff0c;因为 LAME 实际上是一个功能强大的 MP3 编码器。LAME 的开发始于 1998 年&#xff0c;目的是创建一个开放源代码的库&a…

AIPaperGPT写论文靠谱吗?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在信息爆炸的今天&#xff0c;学术写作的挑战日益增加&#xff0c;而AIPaperGPT作为一款旨在提升写作效率的工具&#xff0c;其可靠性自然成为了用户关注的焦点。本文将从多个维度对AIPaperGPT进行全面评估&…

(java+Seleniums3)自动化测试实战

一.web自动化测试基础 密码的加密处理--是在前端JavaScript 二.selenium IDE录制 打开火狐浏览器&#xff1a; 点击 寻找更多附加组件 输入&#xff1a; 选择&#xff1a; 跳转&#xff1a;点击 安装完成&#xff0c;打开之后是这个页面&#xff1a; 录制一个新的测试用例在一个…

黑马点评17——多级缓存-Lua语法

文章目录 Lua语法初始Lua变量和循环条件控制、函数 变量和循环函数和条件控制 Lua语法 初始Lua https://www.lua.org/ 魔兽的一些插件就是用lua开发的。 centOs已经装好了lua&#xff0c;直接用~ 变量和循环 条件控制、函数 变量和循环 函数和条件控制

python项目无法启动?在终端运行 manage.py runserver 8000 没反应该怎么解决

运行 manage.py runserver 8000 没反应&#xff0c;出现提示语句&#xff1a; 根据提示修改命令再次运行 .\manage.py runserver 8000 仍然没反应 解决办法&#xff1a; 1、添加当前目录到 PATH&#xff1a;临时将当前目录添加到 PATH 环境变量中。使用以下命令&#xff1a; …

如何理解有效值电流?电流的均方根值

电流的有效值就是电流的均方根。 有效值电流定义&#xff1a;将一直流电与一交流电分别通过相同阻值的电阻&#xff0c;如果相同时间内两电流通过电阻产生的热量相同&#xff0c;就说这一直流电的电流值是这一交流电的有效值。 如果说电流就是直流电&#xff0c;那么电流的有效…

一、数据结构和算法概述

文章目录 一、数据结构的介绍二、线性结构和非线性结构 一、数据结构的介绍 二、线性结构和非线性结构

Numpy中常用的数学方法

目录 1、数学运算符2、比较运算符3、常用的数学函数4、常用的统计函数 1、数学运算符 import numpy as npa np.array([10,4,6,7]) b np.arange(4) # 两数组值相加 cab # 数组的值平方 db**2 # 两数组对应的值相乘 ea*b # 两数组对应的值相除 fc/a # 两数组对应的值取余 gc…

JDBC的介绍续

四 JDBC的事务支持 4.1 银行转账案例演示 4.4.1 案例分析&#xff1a; 1.需求&#xff1a;一个账号fromAccount向另一个账号toAccount转入money元钱 2.分析&#xff1a; - 检查两个账号是否存在&#xff0c;不存在的话&#xff0c;结束转账行为 - 检查转出账号的里金…

N 皇后

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 ‘Q’ 和 ‘.’…

RP2040 C SDK 64位定时器功能使用

RP2040 C SDK 64位定时器功能使用 &#x1f9e8;RP2040的64位定时器功能介绍参见&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_timer &#x1f389;RP2040有一个单64位计数器&#xff0c;每微秒递增一次看起来很复杂&#xf…

[基于 Vue CLI 5 + Vue 3 + Ant Design Vue 3 搭建项目] 02 配置 nodejs 淘宝镜像仓库

文章目录 为什么要配置淘宝镜像仓库呢如何查看镜像仓库如何配置镜像仓库 为什么要配置淘宝镜像仓库呢 主要是因为默认的镜像仓库是国外的&#xff0c;当我们使用 npm 安装依赖的时候会很慢或者失败&#xff0c;我们配置国内的镜像仓库这样就可以加速我们安装镜像的过程&#x…

这些加密软件功能你都知道吗?

1.透明加密与无感操作&#xff1a; 透明加密是许多现代加密软件的核心功能之一&#xff0c;它允许用户在无感知的情况下对文件进行加密和解密。这意味着用户无需改变日常操作习惯&#xff0c;加密和解密过程在后台自动完成&#xff0c;确保了数据的安全性同时不影响工作效率。…

【阿雄不会写代码】全国职业院校技能大赛GZ036第十套

也不说那么多了&#xff0c;要用到这篇博客&#xff0c;肯定也知道他是干嘛的&#xff0c;给博主点点关注点点赞&#xff01;&#xff01;&#xff01;这样博主才能更新更多免费的教程&#xff0c;不然就直接丢付费专栏里了&#xff0c;需要相关文件请私聊

关于OceanBase MySQL 模式中全局索引 global index 的常见问题

在OceanBase的问答区和开源社区钉钉群聊中&#xff0c;时常会有关于全局索引 global index的诸多提问&#xff0c;因此&#xff0c;借这篇博客&#xff0c;针对其中一些普遍出现的问题进行简要的解答。 什么是 global index &#xff1f; 由于 MySQL 不具备 global index 的概…

利用TCP编程实现FTP功能

模拟FTP核心原理&#xff1a;客户端连接服务器后&#xff0c;向服务器发送一个文件。文件名可以通过参数指定&#xff0c;服务器端接收客户端传来的文件&#xff08;文件名随意&#xff09;&#xff0c;如果文件不存在自动创建文件&#xff0c;如果文件存在&#xff0c;那么清空…

uboot源码分析uboot启动流程,uboot-CMD命令调用关系

uboot的最终目的是引导启动内核加载系统&#xff0c;根据这个线索我们可以首先找到uboot引导内核的main函数&#xff0c;查看系统引导的执行跳转的函数 main_loop。 下面对uboot函数的调用关系和主要调用函数进行分析。 一、uboot函数调用关系梳理 函数调用如下&#xff1a; …