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

C++智能指针

至此,我们智能指针就完成了,我们可以来看看如何使用。...operator[] (3.3)自定义资源删除操作(Deleter)。...weak_ptr是为了配合shared_ptr而引入一种智能指针,它更像是shared_ptr一个助手而不是智能指针,因为它不具有普通指针行为,没有重载operator*和->,因此取名为weak...创建shared_ptr方法就是lock()方法。 注意:shared_ptr实现了operator bool() const方法来判断一个管理资源是否被释放。 7.如何选择智能指针?...这样情况包括: (1.1)有一个指针数组,并使用一些辅助指针来标示特定元素,如最大元素和最小元素; (1.2)两个对象都包含指向第三个对象指针; (1.3)STL容器包含指针。

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

C++ 智能指针(unique_ptr, shared_ptr)源码分析

在博文https://blog.csdn.net/qq_27717921/article/details/82940519已经介绍了unique_ptr和shared_ptr使用,但是这两智能指针是如何做到管理指针呢...采用new返回指针初始化shared_ptr,调用构造函数,在堆上开辟一块存储空间,存放指向这块空间指针数量,这块空间地址初始化use_c. new int(2)返回指针用于初始化p. 2. shared_ptr...拷贝和赋值操作,更新use_count相关源码 auto q(p) //调用拷贝构造函数 auto q = p //调用 = 操作符重载 这两句代码涉及到shared_ptr拷贝构造函数...和 =操作符重载问题, 主要涉及下面三个函数。...= D(); }; 对比shared_ptr头文件,拷贝构造函数和=操作符重载函数是delete.这也就说明unique_ptr中不能进行直接拷贝和赋值操作。

2.5K32

基础知识_Cpp

编译时多态是怎样 2.5. 成员权限控制 2.6. struct和class区别 2.7. Cpp中如何禁止一个创建对象 2.8. 如何限制只能在堆或栈上创建对象 2.9....如何限制只能在堆或栈上创建对象 1.编译器在为对象分配栈空间时,会先检查析构函数访问性,其实不光是析构函数,只要是非静态函数,编译器都会进行检查。...(3)为了统一,可以将构造函数设为protected,然后提供一个publicstatic函数来完成构造,这样不使用new,而是使用一个自定义函数来构造,使用一个自定义函数来析构。...而快排每次对局部数据操作,具有较好缓存命中率。 什么是仿函数 仿函数是对一个括号运算符进行重载,然后可以通过函数调用方式来调用该类所重载运算符。...,用于代替C中通常转换操作。

1.9K30

C++:智能指针

1.2 RAII 一些指针必须手动去释放内存,但是如果我们将这个指针变成自定义类型,他会在栈帧销毁时候去调用对应析构函数。RAII就是大致这种思想。...重载operator*和opertaor->,具有像指针一样行为。 1.4 auto_ptr 智能指针有自己发展历史,各个版本产生结果根本原因就是由于拷贝构造和赋值重载实现思想不同。...但是这种做可能存在一个问题就是有的人会在外去定义!!! (2)放在私有:可以解决问题。 (3)C++11引入delete关键字:这个关键字可以强制默认拷贝构造和赋值重载无法被生成!!..._pcount) { ++(*_pcount);//计数+1 } //赋值重载 shared_ptr& operator=(const shared_ptr& sp) {..._pcount) { ++(*_pcount);//计数+1 } //赋值重载 shared_ptr& operator=(const shared_ptr& sp) {

7500

智能指针探究

,而这样的话,会影响容器内每个元素拷贝赋值 当你用vec1构造vec2时候,那就说明vec1里面的指针,全部为空,当你在不知道这个情况下,你使用vec1里面的智能指针,就全部都是空指针了 既然auto_ptr...shared_ptr是标准库一个智能指针 shared_ptr pa(new A());这行代码,使用一个new A() 创建了一个新A类型对象,并将其地址作为参数传递给shared_ptr...operator*,重载函数operator-> ,它不能够访问资源和裸指针是不一样 例如 class B; class A { public: A() { cout << "A()" << endl...先讲讲智能指针内部是咋回事吧 unique_ptr shared_ptr 一个不带计数,一个带计数 他们两个都是可以带自定义删除器 看他们源码 ~unique_ptr(){ 是一个函数对象调用...//就是上面说deletor { public: void operator() (T *ptr) { delete ptr; } }; 如果我们想自定义删除的话,我们给它提供一个类似这样就行了

6410

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

operator->() 重载 -> 号,当智能指针指向数据类型为自定义结构体时,通过 -> 运算符可以获取其内部指定成员。...operator =() 重载了 = 赋值号,从而可以将 nullptr 或者一个右值 unique_ptr 指针直接赋值给当前同类型 unique_ptr 指针。...operator 重载了 [] 运算符,当 unique_ptr 指针指向一个数组时,可以直接通过 [] 获取指定下标位置处数据。...//注意自定义析构器可能是函数对象,函数对象可以包含任意数量数据,这意味着它们尺寸可能是任意大小 //std::shared_ptr如何能够在不使用更多内存前提下,指涉到任意尺寸析构器?...:如何校验 std::weak_ptr是否失效 //在未失效条件下提供对指涉到对象访问:这个操作通过由 std::weak_ptr创建std::shared_ptr来实现 //方式一:std::weak_ptr

1K20

C++ Qt开发:使用顺序容器

QList::operator=() 重载赋值运算符,将一个列表赋值给另一个列表。 QList::operator==() 重载相等运算符,判断两个列表是否相等。 QList::operator!...QVector 是一个灵活动态数组,适用于需要动态管理元素集合场景,同时由于其连续存储特性,在访问元素效率上相对较高。...QVector::remove(const T &value) 移除向量中所有匹配给定值元素。 QVector::takeAt(int i) 移除并返回向量索引为 i 元素。...QStack::operator=() 重载赋值运算符,将一个栈赋值给另一个栈。 QStack::operator==() 重载相等运算符,判断两个栈是否相等。 QStack::operator!...QQueue::operator=() 重载赋值运算符,将一个队列赋值给另一个队列。 QQueue::operator==() 重载相等运算符,判断两个队列是否相等。

21910

C++知识点

) () 函数调用操作符 function call 一般只要看到 class 内重载了 () 操作符,那他用意就是想要变成一个 function, 其构造对象称为函数对象 标准库中,仿函数会继承一些奇特如...x 值变成 x2 值罢了 int& r2 = r; // r2 reference to r (r2 代表 r, 亦相当于代表 x) // 不管是内置类型还是自定义类型都符合上述结论 reference...通常不用于声明变量,而用于参数类型 (parameter type) 和返回类型 (return type) 描述. void func1(T *pobj) {pobj -> xxx();} void...,即是否能作为重载指标?...(重载) Part I 承接: ---- 全局重载形式 成员重载形式 new 分解为 3 个动作 delete 分解为 2 个动作 接管内存分配和释放行为 ---- 示例,接口 #

84830

C++ 智能指针

所有智能指针都重载了“operator->”操作符,直接返回对象引用,用以操作对象。访问智能指针原来方法则使用“.”操作符。 访问智能指针包含裸指针则可以用 get() 函数。...,一切似乎都良好,无论如何不用我们显示使用该死 delete 了。...boost::shared_ptr 也是用于管理单个堆内存对象。...从上面那个例子看来,似乎没有任何作用,其实 boost::weak_ptr 主要用在软件架构设计中,可以在基(此处并非抽象基,而是指继承于抽象基虚基)中定义一个 boost::weak_ptr...,用于指向子类 boost::shared_ptr,这样基仅仅观察自己 boost::weak_ptr 是否为空就知道子类有没对自己赋值了,而不用影响子类 boost::shared_ptr 引用计数

98740

C++ 智能指针详解

所有智能指针都重载了“operator->”操作符,直接返回对象引用,用以操作对象。访问智能指针原来方法则使用“.”操作符。 访问智能指针包含裸指针则可以用 get() 函数。...,一切似乎都良好,无论如何不用我们显示使用该死delete 了。...boost::shared_ptr 也是用于管理单个堆内存对象。...从上面那个例子看来,似乎没有任何作用,其实 boost::weak_ptr 主要用在软件架构设计中,可以在基(此处并非抽象基,而是指继承于抽象基虚基)中定义一个 boost::weak_ptr...,用于指向子类boost::shared_ptr,这样基仅仅观察自己 boost::weak_ptr 是否为空就知道子类有没对自己赋值了,而不用影响子类 boost::shared_ptr 引用计数

1.9K10

两万字总结《C++ Primer》要点

decltype类型指示符:选择并返回操作符数据类型。只得到类型,不实际计算表达式值。 自定义数据结构 (1) 数据结构是把一组相关数据元素组织起来,然后使用它们策略和方法。...第十四章 重载运算与类型转换 P490-P523 通过运算符重载可重新定义该运算符含义。 14.1 基本概念 定义:重载运算符是具有特殊名字函数。名字由operator和符号组成。...operator--(int); } 14.7 成员访问运算符 operator* operator-> 14.8 函数调用运算符 如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类对象。...形式: operator type() const; (2)避免有二义性类型转换 (3)函数匹配与重载运算符 ::: warning 如果对同一个既提供了转换目标是算术类型类型转换,也提供了重载运算符...基希望派生自定义自身版本函数。

1.5K30

两万字总结《C++ Primer》要点

decltype类型指示符:选择并返回操作符数据类型。只得到类型,不实际计算表达式值。 自定义数据结构 (1) 数据结构是把一组相关数据元素组织起来,然后使用它们策略和方法。...第十四章 重载运算与类型转换 P490-P523 通过运算符重载可重新定义该运算符含义。 14.1 基本概念 定义:重载运算符是具有特殊名字函数。名字由operator和符号组成。...operator--(int); } 14.7 成员访问运算符 operator* operator-> 14.8 函数调用运算符 如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类对象。...形式: operator type() const; (2)避免有二义性类型转换 (3)函数匹配与重载运算符 ::: warning 如果对同一个既提供了转换目标是算术类型类型转换,也提供了重载运算符...基希望派生自定义自身版本函数。

1.7K20

Qt面试题整理

3、 描述过程, 如何实现一个自定义按钮, 使其在光标进入,按下,离开三种状态下显示不同图片....如何使用C++模拟Qt信号和槽 Qt信号和槽原理就是回调函数。所以,我们需要保存对象绑定回调函数 1....2.重载运算符(), 遍历这个表,调用回调函数,即signal触发机制 3.写一个绑定函数Bind,用于将Slot对象添加到槽表中 template class Signal {...shared_ptr也可以安全地放到标准容器中,并弥补了std::auto_ptr 和 QScopedPointer 因为转移语义而不能把指针作为容器元素缺陷。 4....QWeakPointer 是为配合 QSharedPointer 而引入一种智能指针,它更像是 QSharedPointer 一个助手(因为它不具有普通指针行为,没有重载operator*和->)

1.9K10

《C++Primer》第十九章

重载new和delete 重载这两个运算符与重载其他运算符过程大不相同。...2. operator new接口和operator delete接口 标准库定义了operator new函数和operator delete函数8个重载版本。...和其他operator函数不同,这两个函数并没有重载new表达式或者delete表达式。实际上我们根本无法自定义new表达式或者delete表达式行为。...当仅通过一个地址值调用时,定位new使用operator new(size_t, void*),这是以一个我们无法自定义operator new版本,它只是简单地返回指针实参,然后由new表达式负责在指定地址初始化对象以完成整个工作...C语言不支持函数重载,因为也就不难理解一个C链接指示只能用于说明一组重载函数中某一个了: // 错误: 两个extern "C"函数名字相同 extern "C" void print(const

1.3K10

c++智能指针理解与简易实现

智能指针利用c++ RAII特性和模板化编程,本质上是一个包装,使用起来像普通指针一样方便。当最后一个引用动态对象智能指针离开作用域或不在引用动态对象后对其进行清理。...考虑一种情况:如果一个函数同时出现了unique_ptr和unique_ptr重载,并且尝试通过隐式转换调用,那么编译器无法推测应该转换为哪种类型。...最后这里实现仅供学习参考,距离真正可应用还是有差距。像不支持自定义分配器,不支持自定义析构器,不支持weak_ptr,不支持shared_ptr别名,不支持工厂函数构建等等,可优化空间很多。...使用const声明unique_ptr的话,可以限定资源只作用于当前作用域,无法被移动。 weak_ptr只是引用shared_ptr控制块,有一个单独count统计当前控制块引用次数。...针对shared_ptr,工厂函数只进行一次动态内存分配,分配效率高,同时也避免了裸指针方式两次分配中间因为异常导致内存泄露。 如下场景不适合或谨慎使用make工厂函数: 自定义析构器。

73800

【Example】C++ 运算符重载

C++运算符重载核心是:operator 关键字 C++当中运算符重载是通过 operator 关键字来实现,当你定义了或结构体后,编译器肯定无法智能地对本身进行运算及比较。...下面一段代码是在一个中对 = 进行了一个最简单重载: void operator=(const DataPack &in) { this->name = in.name; this...只不过它函数名被强制要求为了【operator 关键字 + 要重载运算符】。 运算符重载目的,就是为了实现自定义数据类型对运算符作用支持。...>value == in.value; }; 【错误】 void operator>=(const DataPack &in) { }; 重载运算符函数体,就是对运算符作用自定义实现: DataPack...【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr 【Example】C++ 接口(抽象)概念讲解及例子演示 【Example】C++ 虚基与虚继承 (菱形继承问题

71430
领券