首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

智能指针小分析

智能指针的实现原理 在STL中,一共是有四种智能指针:auto_ptr,unique_ptr,shared_ptr,weak_ptr。...其中auto_ptr是C++98提供的智能指针,现在基本已经被弃用。原因后面有说。 其中auto_ptr,unique_ptr是独占型的智能指针。...而C++11新出现的智能指针unique_ptr比auto_ptr更聪明好用,unique_ptr拒绝直接的复制/赋值操作,必须通过reset/release接口来进行对象管理权的转移,这无疑提高了安全性...总结一下: auto_ptr不适用于STL容器,且易造成对无效指针的访问导致程序奔溃。 unique_ptr比auto_ptr更加智能,安全性更高,应该选择使用unique_ptr。...由于弱引用不更改引用计数,类似普通指针,只要把循环引用的一方使用弱引用,即可解除循环引用。

58820

日更系列:使用函数指针的小伎俩

一、什么是函数指针 函数指针是一种在C、C++、其他类 C 语言的指针。 C语言标准规定,函数指示符(function designator,即函数名字)既不是左值,也不是右值。...这个接口函数可以是普通函数,类的静态函数,类的成员函数可以吗? 三、使用类的成员函数作为函数指针可以吗 再来看一个例子: 我们有1个接口类,和个实现接口类的实现类。...然后在do里面另分出一个truncate函数,然后把truncated_calculator_vec->IsTrancated传递过去,这样是否可行,能这样写吗?...答案是不可以 } } 显然不能这样写, 在这里需要解释一个问题是“成员指针”而不是普通的函数指针。 函数的成员指针不仅仅是函数指针。...在实现方面,编译器不能使用简单的函数地址,因为你不知道要调用的地址(想想虚函数)。当然,还需要知道对象才能提供this隐式参数。 如果要提供指向现有代码的函数指针,应该编写类的静态成员函数。

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

    C++智能指针原理和实现

    一、智能指针起因   在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。   ...二、智能指针类型 智能指针在C++11版本之后提供,包含在头文件中,标准命名std空间下,有auto_ptr、shared_ptr、weak_ptr、unique_ptr四种,其中auto_ptr...注意事项:   (1) 其构造函数被声明为explicit,因此不能使用赋值运算符对其赋值,即不能使用类似这样的形式 auto_ptr p = new int;   (2) auto_ptr...会造成对象所有权的转移,被拷贝对象在拷贝过程中被修改;   (3) 基于第二条,因此不能将auto_ptr放入到标准容器中或作为容器的成员;   (4) auto_ptr不能指向数组,释放时无法确定是数组指针还是普通指针...auto_ptr是最早期的智能指针,在C++11 中已被弃用,C++17 中移除,建议使用unique_ptr代替auto_ptr。

    55730

    C++智能指针详解(共享指针,唯一指针,自动指针)

    前言:智能指针在C++11中引入,分为三类: shared_ptr:共享指针 unique_ptr:唯一指针 auto_ptr:自动指针 一、共享指针 几个共享指针可以指向同一个对象; 每当shared_ptr...函数生成关联对象的共享指针(可能为空) 当拥有该对象的最后一个共享指针失去其所有权时,任何弱指针都会自动变为空 二、唯一指针 指针唯一性; 继承了自动指针auto_ptr,更不易出错; 抛出异常时可最大限度避免资源泄漏...= nullptr) //如果uq不为空 //check unique_ptr中的原始指针是否为空 if (uq.get() != nullptr) //如果uq不为空 4....void(*)(T *)或 function 或使用decltype 三、自动指针 C++98中存在,于C++11中使用唯一指针替换其它 四、智能指针接口汇总 API Name...如果没有则为未定义的行为) sp->… 提供对拥有对象的成员访问权限(如果没有,则行为未定义) sp.use_count() 返回共享所有者(包括sp)的数目;如果共享指针为空,则返回0 sp.unique() 返回sp是否是唯一所有者

    1.7K20

    C++11智能指针

    Java和C#避免了指针(虽然C#中也能使用指针,但是估计很少有人这样做),其垃圾回收机制,给程序员减轻很多管理内存的负担。...因为unique_ptr的构造函数被声明为explicit,所以不能使用unique_ptr pStr = new string("Hello")这样的方式进行初始化。...delete释放空间,但是普通指针pOtherStr在使用之后要用delete进行空间释放 delete pOtherStr; return 0; } 运行结果: 智能指针的使用和普通指针类似...,但是需要记住智能指针不能使用delete关键字显示释放空间。...最后,有人可能还会遇到auto_ptr这样的指针,auto_ptr是C++98标准中的,现在已经被声明为过时的,unique_ptr完全可以取代auto_ptr,所以以后就不要使用auto_ptr了。

    89120

    动态内存与智能指针

    c/c++语言的一大特色是在于可以动态的进行内存管理,而这也是它的难点所在。程序出现问题,原因经常在动态内存管理这块,比如分配内存后没有及时释放,或者当前线程提前释放了其他线程也会使用的内存。...而c++11中新增的智能指针能在一定程度上解决这些问题 动态内存与智能指针 在c++中动态内存的管理是通过一对运算符来完成的: new和delete ,new为对象分配空间并返回一个指向该对象的指针。...shared_ptr 指向相同的对象 auto p = make_shared(42); //此时p指向的对象只有一个引用值 auto q = p; //此时p指向的对象有两个引用者 我们可以认为每一个...,此函数是为了这样一种情况而设计的:我们需要像不能使用智能指针的代码传递一个内置指针,但这段代码中不能使用delete来销毁这个指针所指向的对象 我们不能将get返回的指针再绑定到另一个智能指针上。...即使有weak_ptr 指向对象,对象还是会被销毁 由于对象可能不存在,所以不能直接使用weak_ptr 来访问对象,需要先调用lock函数,此函数检查weak_ptr 指向的对象是否仍然存在。

    86320

    STL四种智能指针

    对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的析构函数会删除该对象。然后让赋值操作转让所有权。...我查了一下在使用unique_ptr来访问资源前,是否有判断的API,可惜查阅了C++ reference,并没有发现unique_ptr提供判空接口,希望C++标准以后能够继续完善unique_ptr...为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。...做法就是上面的代码注释的地方取消注释,取消Woman类或者Man类的任意一个即可,也可同时取消注释,全部换成弱引用weak_ptr。...、boost:: intrusive_ptr也可以在实际编程实践中拿来使用,但这里不做进一步的介绍,有兴趣的读者可以参考:C++ 智能指针详解。

    2.7K41

    C++ —— 以真我之名 如飞花般绚丽 - 智能指针

    的explicit 修饰 shared_ptr 和 unique_ptr 的构造函数都使用explicit 修饰,防⽌普通指针隐式类型转换 成智能指针对象 expired:判断当前weak_ptr...智能指针是否还有托管的对象,有则返回false,无则返回true 如果返回true,等价于 use_count() == 0,也就是已经没有托管的对象了,也有可能是还有析构函数进行释放内存,但此对象的析构已经发生...void kiana() { // expired:判断当前智能指针是否还有托管的对象,有则返回false,无则返回true if (!...怎样才能使用delete[] 智能指针析构时默认是进⾏delete释放资源,这也就意味着如果不是new出来的资源,交给智能指针管理,析构时就会崩溃 // 这样实现程序会崩溃 unique_ptr<Date...⼀ 在Boost库的开发中,Boost社区也在这个⽅向上取得了丰硕的成果,C++11及之后的新语法 和库有很多都是从Boost中来的 2.

    9710

    基于C++,手把手教你实现智能指针管理功能

    一、基础概念 谈到C++,绕不开的一个特性是智能指针,智能指针见字如面:有两个概念:一个是指针,一个是“智能”。 和类似指针的相同使用方式使用他,它可以托管任何使用“new”创建的对象。...“智能”指的是使用者不需要关注什么时候是否需要删除这块new出来的内存,内存管理由指针内部自动删除 1.1 范畴 C++11智能指针的范畴包括 类型unique_ptr, shared_ptr和weak_ptr...这里你仍然有个疑问,weak_ptr不能用普通的pointer替代,回答这个问题前,我们来挖掘看看weak_ptr到底还有其他的收益吗 以下这个例子显示了3个shared指针sp1,sp2和sp3拥有了一块对象...\n"; } C++20支持这种写法 auto ptr = std::make_shared(3); 2.1.2 使用方式二 使用std::make_shared,那么两种使用方式有区别吗...2.1.3 shared_ptr和多态 C++多态是重要功能,结合shared_ptr,也可以有多态 #include #include class Base

    59700

    C++智能指针

    为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。...C++准标准库Boost中的智能指针,比如boost::scoped_ptr、boost::shared_array、boost:: intrusive_ptr在这里不做研究,有兴趣的读者可以参考:C+...对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的析构函数会删除该对象。然后让赋值操作转让所有权。...我查了一下在使用unique_ptr来访问资源前,是否有判断的API,可惜查阅了C++ reference,并没有发现unique_ptr提供判空接口,希望C++标准以后能够继续完善unique_ptr...做法就是上面的代码注释的地方取消注释,取消Woman类或者Man类的任意一个即可,也可同时取消注释,全部换成弱引用weak_ptr。

    3.5K30

    【C++】智能指针详解

    如果混合使用的话,智能指针自动释放之后,普通指针有时就会变成悬空指针,当将一个shared_ptr绑定到一个普通指针时,我们就将内存的管理责任交给了这个shared_ptr。...在改变底层对象之前,我们检查自己是否是当前对象仅有的用户。如果不是,在改变之前要制作一份新的拷贝: if(!...某个时刻只能有一个unique_ptr指向一个给定对象,由于一个unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作。...不能拷贝unique_ptr有一个例外:我们可以拷贝或赋值一个将要被销毁的unique_ptr.最常见的例子是从函数返回一个unique_ptr. unique_ptr clone(int p...weak_ptr的操作 由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock,此函数检查weak_ptr指向的对象是否存在。

    92430

    《智能指针:明晰资源所有权的 C++利器》

    在 C++编程领域,资源管理一直是一个至关重要且颇具挑战性的任务。其中,资源所有权的清晰界定与有效表达是构建稳定、高效程序的关键环节。...传统的 C++编程中,使用普通指针时,资源所有权往往模糊不清。一个指针可能在多处被传递、赋值,导致难以确定究竟哪个部分的代码负责释放该指针所指向的资源。...当一个 unique_ptr 被创建并指向某一资源时,它就如同在这片资源上插上了自己的旗帜,宣告对其拥有独占权。在 unique_ptr 的生命周期内,它全权负责该资源的管理与释放。...再看 shared_ptr,它所采用的共享所有权机制则适用于多个部分的代码都需要访问同一资源的场景。shared_ptr 通过内部的引用计数来记录有多少个“管理者”共同拥有这份资源。...总之,智能指针在 C++编程中犹如一盏明灯,照亮了资源所有权这片复杂而又关键的领域。它通过独特的语义和机制,让资源所有权不再是一团迷雾,而是清晰可见、可管理的实体。

    4900

    C++一分钟之-智能指针:unique_ptr与shared_ptr

    智能指针是C++中用于自动管理内存的工具,它们通过模拟拥有所有权的对象来防止内存泄漏,其中unique_ptr和shared_ptr是最常用的两种类型。...它通过引用计数来追踪有多少个shared_ptr指向同一资源,当最后一个指向该资源的shared_ptr销毁时,资源被释放。这使得shared_ptr非常适合于复杂数据结构的共享和跨组件传递。...循环引用导致的内存泄漏使用shared_ptr时,如果不小心形成了循环引用(两个或多个shared_ptr互相引用形成闭环),即使所有指向它们的普通引用都已消失,它们的引用计数也不会降为零,从而导致资源无法释放...和shared_ptr是C++智能指针家族中的两大支柱,它们各自适用于不同的场景。...通过了解它们的工作原理、识别常见问题和易错点,并采取相应的避免策略,开发者可以更加高效地利用智能指针的强大功能,构建高质量的C++应用程序。

    1.1K10

    详解C++11智能指针

    前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。...C++11智能指针介绍 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。...对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。...这种随情况而已的行为表明,unique_ptr 优于允许两种赋值的auto_ptr 。 注:如果确实想执行类似与#1的操作,要安全的重用这种指针,可给它赋新值。...C++有一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。尽管转移所有权后 还是有可能出现原有指针调用(调用就崩溃)的情况。

    1.7K50

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

    和裸指针有相同的尺寸,甚至可以在内存和时钟周期紧张场合下使用 //情况1:std::unique_ptr是个只移动型别,不可以复制 //移动一个std::unique_ptr会将所有权从源指针移动到目标指针...get() 获取当前 unique_ptr 指针内部包含的普通指针。 get_deleter() 获取当前 unique_ptr 指针释放堆内存空间所用的规则。...operator bool() unique_ptr 指针可直接作为 if 语句的判断条件,以判断该指针是否为空,如果为空,则为 false;反之为 true。...reset(p) 其中 p 表示一个普通指针,如果 p 为 nullptr,则当前 unique_ptr 也变成空指针;反之,则该函数会释放当前 unique_ptr 指针指向的堆内存(如果有),然后获取...即使默认函数实现有着 正确行为, // 也必须这样做 // • 上述建议仅适用于 std::unique_ptr, 但并不适用 std::shared_ptr

    1K20
    领券