首页
学习
活动
专区
圈层
工具
发布

面试官:为什么大厂拒绝使用shared_ptr(shared_ptr vs intrusive_ptr)?

各位老师好(老师是山东对人的尊称,就像称呼帅哥美女一样) C++周刊 (c++ weekly)第二期开始了 本期预告: • 本期我们将深入理解shared_ptr • 帮你破解大厂经典面试题智能指针使用场景...库的编译链接 如何给一个高速行驶的汽车换轮胎(实现一个可扩展c++服务) 3 STL Traits 技术 4 新特性 if constexpr 5 新特性 面试题:C++中shared_ptr是线程安全的吗...即使使用 make_shared优化,将两次分配合并为一次, 控制块和对象T仍然在内存上是紧邻的同一个内存块。...频繁创建和释放数百万个这样的混合块,会严重加剧内存碎片化。 • 缓存不友好(Cache Unfriendly): 这是更隐蔽的性能杀手。...内存布局 缓存友好。对象和计数器在一起,常在同一缓存行。 可能缓存不友好。对象和控制块可能分离。 性能 稍高。无额外分配,缓存局部性更好。但原子操作开销仍在。 稍低。有分配开销,可能缓存不友好。

32310

C++智能指针避坑指南:90%人会犯的3个致命错误

你以为将new替换为make_shared就万事大吉?真相是,智能指针的陷阱比手动管理更隐蔽、更危险。本文将深入剖析循环引用、性能陷阱、线程安全这三大「暗礁」,让你从「自以为会」到「真正精通」。...一个经典的崩溃代码如下代码展露了智能指针中的循环引用问题。...//内存泄漏,最终OOM(内存耗尽)}这就是智能指针最讽刺的地方:你为了避免内存泄漏而使用它,结果它却导致了更隐蔽的内存泄漏。...性能陷阱——你以为的「零成本」抽象2.1shared_ptr的隐藏成本展开代码语言:C++AI代码解释//性能测试:shared_ptrvs原始指针voidbenchmark_shared_ptr...;t1.join();t2.join();//这里有两个独立的数据竞争://1.对p本身的修改(shared_ptr对象)//2.对新旧int对象的访问};3.3线程安全智能指针实现展开代码语言:C++

24800
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Chapter 4: Smart Pointers

    通用的例子是将 std::unique_ptr 作为返回层次结构中对象的工厂函数的返回类型,对于这样一个层次结构,工厂函数通常在堆上分配一个对象,然后返回指向该对象的指针,而工厂函数调用者则负责在使用完对象后...就会对 a 指向对象的引用计数减 1 ,对 b 指向对象的引用计数加 1 ) 引用计数的存在有一些性能影响 std::shared_ptr 的大小是原始指针大小的两倍 引用计数的内存必须是动态分配的...std::shared_ptr - 如果要使用原始指针来构造 std::shared_ptr ,那么最好在 new 之后就将指针传给 std::shared_ptr 的构造函数,然后使用现有的...(WidgetID id); 如果 loadWidget 是一个调用代价较高的函数,一个合理的优化是在内部缓存每次查询的结果,但是每次请求 Widget 都要缓存的话会导致性能问题,因此另一个合理的优化是当...,其中 A 和 C 持有指向 B 的 std::shared_ptr ,如果 B 也想持有对 A 的指针,那么有三种选择 原始指针:如果 A 被销毁了,而 C 通过 B 来访问 A 就会出现解引用悬空指针

    2K20

    被蚂蚁面试官拷打了,基础真的是太重要了...

    ) 5、数据库和缓存的不一致性问题如何解决(老生常谈了) 6、C++中为什么父类要定义虚析构函数(可能看我不太懂C++,问了个奇怪问题) 7、C++14、17、20新特性有了解吗 8、C++中shared_ptr...具体的步骤是,先删除缓存,再写数据库,休眠一段时间后再次删除缓存。设置缓存过期时间,所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值,然后再回填缓存。...,不能与其他智能指针共享对象。...shared_ptr:共享式智能指针,允许多个指针指向同一个对象。...shared_ptr适用于多个指针共享同一个资源的情况,例如多个指针指向同一个动态分配的数组或对象。

    45821

    【C++】简单实现C++11的三种智能指针

    垃圾回收器不期望程序员手动控制对象的回收, 因此失效对象的回收时间是无法预测的, 程序员只能控制需要使用的生命周期(或者使用with获得一定的手动控制能力), 从而难以预测性能....智能指针则完全由程序员控制 垃圾回收器对于资源的释放有时候有优化, 例如将大批需要释放的资源集中起来一起释放, 这可以提高回收的效率, 智能指针大多只能逐个释放....但是垃圾回收器的分析和执行仍然有很大的代价 垃圾回收器有时候会遇到缓存优化的问题, 而且回收的时间可能会造成停顿, 智能指针在这点上表现更好, 可以实时处理 垃圾回收器一般在单独的线程中执行, 而智能指针的回收在当前线程的析构函数中执行...和weak_ptr都有一个堆储存的计数器来维护计数进行内存回收, 为了编写的方便将其写为一个基类来继承 由于shared_ptr和weak_ptr的计数器是共享的, 有可能被多线程竞争修改, 因此需要有额外的...的简单实现 shared_ptr需要一个间接层处理引用计数的问题, 因此带来了额外的开销, unique_ptr则完全没有额外的空间开销 对于性能不敏感的情况, 最好不要使用原始指针 建议不要对某个对象进行两次以上的

    2.7K20

    使用 C++ 智能指针遇到的坑

    使用 C++ 智能指针遇到的坑 阅读收益 智能指针目的就是代替原始指针,那么问题来了,原始指针都可以用智能指针代替吗?...不能 智能指针 unique_ptr、shared_ptr 和 weak_ptr三个,那么问题来了 一个不能代替全部吗?...对象所有权 在编程语言中,对堆对象的内存管理是一个麻烦又复杂的问题。一不小心就会带来问题(堆上数据通过指针来访问。) C++里多个变量指向同一块内存导致重复释放。...对象的所有权意味着当我们分配一个对象的时候,谁持有这个对象的所有权 ? Guru Questions 1(大师级问题) 既然智指针,能避免内存泄漏问题, 能代替all场景的原始指针吗?..., 为什么发明三个 而不是一个,来一统天下。 unique_ptr 代替全部原始指针吗? 答:不是的,如果使用不当会造成 core 或者 不执行析构函数。 在类的成员,或者函数参数传递。

    3.2K50

    京东面经(含答案)

    当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。...但它可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象,从而操作资源。...智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。...DPDK内部实现(这个是因为简历上有写,关于一个高性能数据包处理库) Winpcap:它的一个流程是npf网络组包过滤器首先负责从网络中采集数据包,完成数据的过滤拷贝到内核缓存区,然后调用相应的动态库文件将数据传递到应用层缓冲区...(3)将原始的数据包还原成流保存 减少对数据包的存储,在内核层提供了通用socket环形缓冲,不进入内核协议栈,最后在应用层通过socket链接同时使用mmap技术直接访问socket环状缓冲区 libevent

    1.2K10

    目录1.智能指针的作用2.智能指针的使用3.智能指针的设计和实现

    不能将指针直接赋值给一个智能指针,一个是类,一个是指针。例如std::shared_ptr p4 = new int(1);的写法是错误的 拷贝和赋值。...get函数获取原始指针 注意不要用一个原始指针初始化多个shared_ptr,否则会造成二次释放同一内存 注意避免循环引用,shared_ptr的一个最大的陷阱是循环引用,循环,循环引用会导致堆内存无法正确释放...但当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr。...智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。...智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。

    1.7K30

    C++常见避坑指南

    空指针并不指向任何有效的内存地址,所以在调用成员函数时会尝试访问一个不存在的内存地址,从而导致程序崩溃。...类的成员函数并不与具体对象绑定,所有的对象共用同一份成员函数体,当程序被编译后,成员函数的地址即已确定,这份共有的成员函数体之所以能够把不同对象的数据区分开来,靠的是隐式传递给成员函数的this指针,成员函数中对成员变量的访问都是转化成...在 "pass-by-value" 中,函数参数会创建一个副本,而在 "pass-by-reference-to-const" 中,函数参数会成为原始对象的一个引用,且为了避免修改原始对象,使用了常量引用...如果多个执行线程在没有同步的情况下访问同一个 shared_ptr 实例,并且这些访问中的任何一个使用了 shared_ptr 的非 const 成员函数,则会发生数据竞争;可以使用shared_ptr...const int* const 表示一个不可修改的指针,既不能修改指针本身,也不能通过指针修改所指向的值。 总之,const默认与其左边结合,当左边没有任何东西则与右边结合。

    1.2K10

    STL四种智能指针

    如果ps和vocation是常规指针,则两个指针将指向同一个string对象。这是不能接受的,因为程序将试图删除同一个对象两次,一次是ps过期时,另一次是vocation过期时。...这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费空间,所以智能指针都未采用此方案。 (2)建立所有权(ownership)概念。...但是矩阵类的智能指针类设计思想和Point类一样啊,就不能借用吗?答案当然是能,那就是使用模板技术。为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。...答案是:在需要访问资源的时候weak_ptr为你生成一个shared_ptr,shared_ptr能够保证在shared_ptr没有被释放之前,其所管理的资源是不会被释放的。...shared_ptr将接管原来归unique_ptr所有的对象。 在满足unique_ptr要求的条件时,也可使用auto_ptr,但unique_ptr是更好的选择。

    3.1K41

    智能指针在面试中得重要地位!

    ::shared+ptr 可以通过访问某资源的引用计数来确定是否自己是最后一个指涉及到该资源的。...,即不再有 shared_ptr指涉到该资源,则std::shared_ptr会析构 /** 引用计数带来性能影响: 1,std::shared_ptr的尺寸使裸指针的两倍,其内部包含一个指涉到该资源的裸指针...std::shared_ptr 产生后,原有的 std::shared将不再指涉到其资源,结果是不需要进行任何引用计数操作。...//好处三:性能提升 std::shared_ptr spww(new Widget); //直接使用 new ,除了要为 Widget 进行一次内存分配,还要为与其相关联得控制块再进行一次内存分配...,之后把原来再主类中得数据成员放置到实现类中 //并通过指针间接访问这些数据成员 /** Pimpl 习惯用法: 第1 部分,是声明 个指针型别的数据成员,指涉到 个非完整型别, 第2 部分,是动态分配和回收持有从前在原始类里的那些数据成员的对象

    1.4K20

    C++智能指针

    如此做,指针指针,辅助类对象与被引用对象的关系如下图所示: image.png 辅助类将引用计数与智能指针类指向的对象封装在一起,引用计数记录有多少个智能指针指向同一对象。...目前这个智能指针智能用于管理Point类的基础对象,如果此时定义了个矩阵的基础对象类,那不是还得重新写一个属于矩阵类的智能指针类吗?但是矩阵类的智能指针类设计思想和Point类一样啊,就不能借用吗?...如果ps和vocation是常规指针,则两个指针将指向同一个string对象。这是不能接受的,因为程序将试图删除同一个对象两次,一次是ps过期时,另一次是vocation过期时。...答案是:在需要访问资源的时候weak_ptr为你生成一个shared_ptr,shared_ptr能够保证在shared_ptr没有被释放之前,其所管理的资源是不会被释放的。...shared_ptr将接管原来归unique_ptr所有的对象。 在满足unique_ptr要求的条件时,也可使用auto_ptr,但unique_ptr是更好的选择。

    4.1K40

    字节一面,轻松通过!

    如果需要在多线程环境下使用,可以通过Collections.synchronizedList方法来获得一个线程安全的List,但这样可能会降低性能。...std::shared_ptr 是 C++11 引入的智能指针,用于管理动态分配的对象。它允许多个指针共享对同一对象的所有权,提供了一种更安全和方便的内存管理方式,避免了内存泄漏和悬空指针的问题。...特点和用法 共享所有权: std::shared_ptr 允许多个智能指针共同拥有同一个对象,并且在最后一个引用被销毁时自动释放所持有的资源。...不要将裸指针和 std::shared_ptr 混合使用,以免发生悬空指针或重复释放的问题。 使用 std::make_shared 来分配动态对象,因为它能更好地管理内存。...当共享同一个资源时,确保在不再需要时及时释放智能指针。 std::shared_ptr 是 C++ 中常用的智能指针之一,可以帮助管理动态分配的资源,避免内存泄漏,并提高代码的安全性和可维护性。

    64710

    彻底搞懂之C++智能指针

    shared_ptr 采用引用计数的智能指针。 如果你想要将一个原始指针分配给多个所有者(例如,从容器返回了指针副本又想保留原始指针时),请使用该指针。...weak_ptr 结合 shared_ptr 使用的特例智能指针。 weak_ptr 提供对一个或多个 shared_ptr 实例拥有的对象的访问,但不参与引用计数。...所有实例均指向同一个对象,并共享对一个“控制块”(每当新的 shared_ptr 添加、超出范围或重置时增加和减少引用计数)的访问权限。 当引用计数达到零时,控制块将删除内存资源和自身。...因为除了要管理一个裸指针外,还要维护一个引用计数。 因此相比于 unique_ptr, shared_ptr 的内存占用更高 原子操作性能低 考虑到线程安全问题,引用计数的增减必须是原子操作。...对于此种场景,我们尽量使用 std::move,将 shared_ptr 转移给新的对象。因为移动不用增加引用计数,性能比复制更好。 汇总  智能指针能更安全的回收内存,它能防止:   1.

    4.4K10

    【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

    --Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...该指针最常用的情况是单例模式和编译防火墙的封装。 如果非要抬杠,使用 get() 函数获取到裸指针给另外一个裸指针,那么你使用智能指针的意义又何在呢?...因此 shared_ptr 是最常用的智能指针,也是最容易出问题的智能指针。 使用它时应当注意: 1,不要将已存在裸指针交由 shared_ptr,任何形式的智能指针都不应该去托管已有的裸指针。...所以,weak_ptr 的作用就是作为一个 "观察者" 访问 shared_ptr 本身,而不是 shared_ptr 所托管的资源。...此函数的速度更快,导致内存碎片更少,但在一次分配时不存在异常,而不是在另一种分配上。 通过使引用对象和更新智能指针中的引用计数的代码具有的更好的地址来提高性能。

    1.6K20

    C++11 weak_ptr 原理与详细教程

    lock() 方法是访问对象的唯一安全方式内部检查共享引用计数,确保对象存在后才创建 shared_ptr返回的 shared_ptr 会增加共享引用计数,延长对象生命周期与 shared_ptr 的协同共享同一个控制块...weak_ptr 的 lock() 和 expired() 是线程安全的但返回的 shared_ptr 所指向的对象仍需同步保护六、weak_ptr 与其他智能指针对比特性weak_ptrshared_ptrunique_ptr...所有权无所有权共享所有权独占所有权引用计数弱引用计数共享引用计数无大小一个指针大小两个指针大小一个指针大小主要用途解决循环引用、观察对象共享资源独占资源访问对象需通过 lock() 获取 shared_ptr...直接访问直接访问线程安全是(引用计数操作)是(引用计数操作)否选择建议:当需要共享资源时,使用 shared_ptr当需要独占资源时,使用 unique_ptr(性能更优)当需要观察 shared_ptr...管理的资源且不影响其生命周期时,使用 weak_ptr当 shared_ptr 形成循环引用时,将其中一个改为 weak_ptr七、总结std::weak_ptr 是 C++ 智能指针体系中的重要组成部分

    53010

    百度C++实习生面试题深度解析(上篇)

    在实际编程中,unique_ptr通常用于替代裸指针,实现资源的自动管理,避免因为忘记delete而导致的内存泄漏。它也是工厂函数返回对象的理想选择,可以明确表示调用者将获得对象的所有权。...这种机制适用于需要多个组件共享同一份数据的场景,比如缓存系统、观察者模式等。 weak_ptr 的设计目的是作为shared_ptr的补充,它不拥有对象的所有权,也不会增加引用计数。...如果对象仍然存在,lock方法会返回一个有效的shared_ptr,此时可以安全地访问对象;如果对象已经被销毁,lock方法返回空的shared_ptr,回调函数就不执行任何操作。...如果需要元素有序或者经常进行范围查询,map是更好的选择。如果主要进行单个元素的查找操作,并且不关心顺序,unordered_map通常能提供更好的性能。...这种设计的目的是为了提供最高的性能,在已知索引安全的情况下避免不必要的检查开销。 相比之下,at()方法会进行完整的边界检查。

    19010

    第 12 章 动态内存

    为了更容易和安全地使用动态内存,新标准库提供了智能指针类型来管理动态对象。 shared_ptr,允许多个指针指向同一个对象。 unique_ptr,“独占”所指向的对象。...也可以将智能指针绑定到一个指向其他类型的资源的指针上,但是我们必须提供自己的操作来代替 delete。 轻易不要使用一个内置指针来访问一个智能指针所负责的对象,因为我们无法知道对象何时会被销毁。...int j = *x; // 错误, x是一个空悬指针 get用来将指针的访问权限传递给代码,只有在确定代码不会 delete指针的情况下,才能使用 get。...,当一个应用需要可变数量的对象时,应该使用标准库容器而不是动态分配的数组,使用容器更为简单、更不容易出现内存管理错误并且可能有着更好的性能。...,用这个指针来访问元素 new将内存分配和对象构造组合在了一起,delete将对象析构和内存释放组合在了一起。

    1.7K40

    深入理解 C++ 智能指针与资源管理:现代内存安全的基石

    一、引言C++ 因其强大的性能和底层控制能力而广受欢迎,但这也带来了一个长期困扰开发者的问题:资源管理。内存泄漏、悬空指针、重复释放等问题频繁出现,尤其是在大规模工程中,极易造成灾难性后果。...本篇文章将全面解析智能指针的原理、使用方法及其背后的资源管理机制。...三、原始指针的风险与挑战传统的 new/delete 操作极易出错:cpp复制编辑int* ptr = new int(10);delete ptr;ptr = nullptr; // 若忘记这一步,可能访问悬空指针常见问题...// sp 是 shared_ptr,可访问资源}八、智能指针与 STL 容器结合可以将智能指针用于标准容器:cpp复制编辑std::vector> vec;vec.push_back...十一、底层实现与性能对比11.1 引用计数开销 shared_ptr 带有控制块(控制引用计数与析构器) 增加引用计数是线程安全的(可能有锁或原子操作) 11.2 unique_ptr 性能优于 shared_ptr

    39310
    领券