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

C++智能指针

1.智能指针的由来 C++,动态内存的管理是通过一对运算符来完成的,new用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针。...对动态内存的管理,可以引申为对系统资源的管理,但是C++程序动态内存只是最常使用的一种资源,其他常见的资源还包括文件描述符(file descriptor)、互斥锁(mutex locks)、图形界面的字型和笔刷...做法就是上面的代码注释的地方取消注释,取消Woman类或者Man类的任意一个即可,也可同时取消注释,全部换成弱引用weak_ptr。...在掌握了上面提到的C++ STL的四种智能指针后,大家可能会想另一个问题:在实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。...C++中文版(第三版).2011:61-77 [3]C++智能指针简单剖析 [4]shared_ptr基于引用计数智能指针实现 [5] C++智能指针的设计和使用 [6]C++11智能指针之

3.5K30

NeilBlog

return mptr; } private: T *mptr; }; int main() { CSmartPtr ptrl(new int); *ptrl = 20;// 这一行使用重载的解引用运算符来访问...不带引用计数的智能指针 不带引用计数的:是只能一个指针管理资源 auto_ptr:C++库里面的 C++11新标准:scoped_ptr和unique_ptr 首先说auto_ptr 1 2 auto_ptr...当你使用std::move函数将一个unique_ptr对象转化为右值引用并将其赋值给另一个unique_ptr对象来初始化时,就会调用这个运算符 第三行代码创建一个unique_ptr对象p1...删除器是一个函数对象,用于在智能指针销毁时释放其所指向的资源 在这段代码,删除器是一个 lambda 表达式。lambda 表达式是一种匿名函数,它可以捕获上下文中的变量并在其函数体中使用。...这个 lambda 表达式接受一个 int 指针作为参数,并在其函数体中使用 delete[] 运算符来释放该指针所指向的数组 当 ptr1 被销毁时,它会调用这个 lambda 表达式来释放其所指向的数组

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

STL四种智能指针

} SmartPtr(const SmartPtr &sp):rp(sp.rp){++rp->count;} //重载赋值运算符 SmartPtr& operator=(const...做法就是上面的代码注释的地方取消注释,取消Woman类或者Man类的任意一个即可,也可同时取消注释,全部换成弱引用weak_ptr。...5.如何选择智能指针 上文简单地介绍了C++标准模板库STL四种智能指针,当然,除了STL的智能指针,C++准标准库Boost的智能指针,比如boost::scoped_ptr、boost::shared_array...、boost:: intrusive_ptr也可以在实际编程实践拿来使用,但这里不做进一步的介绍,有兴趣的读者可以参考:C++ 智能指针详解。...C++中文版(第三版).2011:61-77 [3]C++智能指针简单剖析 [4]shared_ptr基于引用计数智能指针实现 [5] C++智能指针的设计和使用 [6]C++11智能指针之

2.7K41

整理了70道C语言与C++常见问答题

7 C 语言的 malloc 和 C++ 的 new 有什么区别 new 、delete 是操作符,可以重载,只能在C++使用。...; 可以有const指针,但是没有const引用; 指针在使用可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变; 指针可以有多级指针(**p),而引用止于一级; 指针和引用使用++运算符的意义不一样...C语言的结构数据成员是没有private、public和protected访问限定的。而C++的类的成员有这些访问限定。 C语言的结构体是没有继承关系的,而C++的类却有丰富的继承关系。...而赋值运算符则需要这个操作,另外赋值运算如果原来的对象中有内存分配要先把内存释放掉。 「注意」:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认 的。...41 在C++使用malloc申请的内存能否通过delete释放?使用new申请的内存能否用free?

3K01

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

该对象在其构造函数创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。...使用它时应当注意: 1,不要将已存在裸指针交由 shared_ptr,任何形式的智能指针都不应该去托管已有的裸指针。 2,作为函数参数传递时,请传递引用。...通过使引用对象和更新智能指针引用计数的代码具有的更好的地址来提高性能。 make_unique 如果不需要对对象的共享访问权限,请考虑使用。 ...【Example】C++ 标准库常用容器全面概述 【Example】C++ 回调函数及 std::function 与 std::bind 【Example】C++ 运算符重载 【Example】C++...标准库智能指针 unique_ptr 与 shared_ptr 【Example】C++ 接口(抽象类)概念讲解及例子演示 【Example】C++ 虚基类与虚继承 (菱形继承问题) 【Example

97420

C++11智能指针

为了带来指针更好的使用体验,C++引入了智能指针的概念,其实质就是将指针的一些操作封装成类,程序员通过使用熟悉的指针运算符(-> 和 *)访问封装指针,该指针类通过运算符重载返回封装的原始指针。...C++ 智能指针思路类似于C#等语言中创建对象的过程:创建对象后让系统负责在正确的时间将其删除。 不同之处在于,C++没有单独的在后台运行的垃圾回收器。...C++智能指针是在 标头文件的 std 命名空间中定义的。...当然,你可以转移所有权,让该指针释放对该对象的引用,让其他指针指向该对象。unique_ptr有效地防治了内存泄露(resource leaks)。...最后,有人可能还会遇到auto_ptr这样的指针,auto_ptr是C++98标准的,现在已经被声明为过时的,unique_ptr完全可以取代auto_ptr,所以以后就不要使用auto_ptr了。

86520

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

并在确定没有变量对其操作后主动调用delete或delete[]进行释放。...智能指针利用c++ RAII的特性和模板化编程,本质上是一个包装类,使用起来像普通指针一样方便。当最后一个引用动态对象的智能指针离开作用域或不在引用动态对象后对其进行清理。...考虑一种情况:如果一个函数同时出现了unique_ptrunique_ptr重载,并且尝试通过隐式转换调用,那么编译器无法推测应该转换为哪种类型。...使用const声明unique_ptr的话,可以限定资源只作用于当前作用域,无法被移动。 weak_ptr只是引用shared_ptr的控制块,有一个单独的count统计当前控制块引用次数。...shared_ptr可以由unique_ptr右值引用构造,所以对象的工厂函数如果不确定所有权的话可以一律使用unique_ptr返回。

73700

C++惯用法之消除垃圾收集器-资源获取即初始化方法(RAII)

这意味着任何字符串、列表、映射以及从这些派生的任何结构都必须存在于堆的动态内存。 程序员使用四个基本操作明确地分配和释放动态内存:malloc、realloc、calloc和free。...构造string对象,调用重载方法,并在函数退出时自动销毁。不幸的是,同样的简单也会导致其他问题。...惯用的现代C++将在这里使用unique_ptr,它实现了期望的行为。它删除指针超出范围时指向的对象。然而,这种行为直到C++11才成为语言的一部分。...您应该在完成后自己删除它,还是它属于某个稍后将被一次性释放的数据结构?一方面出错,内存泄漏,另一方面出错,你已经破坏了正在讨论的数据结构和其他可能的数据结构,因为它们试图取消引用现在不再有效的指针。...在C ++运算符new用于创建这样的对象。为了销毁对象,可以使用运算符delete。由new操作员创建的对象是动态分配的,即在动态内存(也称为堆或空闲存储)中分配。

84620

C++基础知识

从中可看出,调用静态成员函数使用如下格式:::(); C++和C的区别 设计思想上 C++是面向对象的语言,而 C 是面向过程的结构化编程语言 语法上 C++具有重载...它也是四个强制类型转换运算符唯一能够去除 const 属性的运算符。...static_cast主要有如下几种用法: 用于类层次结构基类和派生类之间指针或引用的转换。 进行向上转换是安全的; 进行向下转换时,由于没有动态类型检查,所以是不安全的。...指针在使用可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变; 指针可以有多级指针(**p),而引用至于一级; 指针和引用使用++运算符的意义不一样; 如果返回动态内存分配的对象或者内存,必须使用指针...放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少 get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的。

1.4K32

每个C++开发者都应该学习和使用的C++11特性

安全性:在重载函数或者模板使用 nullptr 可以避免因为整数类型的隐式转换导致的调用错误的重载版本的问题。 语法清晰:使用 nullptr 可以让代码更加清晰明了,表达程序员的意图。...它是一种简化遍历容器、数组和其他类似数据结构的循环语法。...移动语义的背景: 在传统的C++,对象的赋值和传递通常会进行复制操作,即调用拷贝构造函数或拷贝赋值运算符。...通过使用移动构造函数和移动赋值运算符,可以避免不必要的深拷贝,提高程序的效率。 3....移动语义的实现: 为了支持移动语义,需要在类定义移动构造函数和移动赋值运算符并在这些函数执行资源的转移操作。同时,也需要标记需要移动的对象为右值引用

5110

基础知识_Cpp

在一个有指针对象的类至少要实现哪三个函数 2.13. 如果没有实现拷贝赋值运算符可能会遇到什么问题(深拷贝、浅拷贝) 2.14. 指针和引用的区别 2.15. volatile 2.16....已放弃 (核心已转储) using namespace std 1.在头文件中一定不要使用,否则在别人引用你的头文件后,如果std的函数名和其他库的冲突了,可能会带来麻烦。...指针和引用的区别 指针也是一个变量,里面存储的内容是一个地址。而引用本质上是一个常量指针,引用只允许初始化,不能再修改。 编译指针和引用的代码,在汇编上是一样的:c++引用和指针的区别是什么?...什么是仿函数 仿函数是对一个类的括号运算符进行重载,然后可以通过函数调用的方式来调用该类所重载运算符。 哪些情况迭代器会失效 一般发生在对容器进行insert()、erase()后。...用于类层次结构基类和派生类之间指针或引用的转换 // 上行转换(派生类---->基类)是安全的 CDerived *tCDerived1 = nullptr; CBase *tCBase1 = static_cast

1.9K30

C++关键知识点梳理

,需在使用的cc文件声明external const int budSize;const &:C++const的引用经常用于函数的参数或者函数的返回值,用于不被修改的对象使用安全性,例如,void...结构体:定义了一组关联的数据结构C++结构体不具备继承、封装、动态面向对象的特点,成员默认访问权限是public,有构造函数和析构函数。...unique_ptr:不支持拷贝和赋值,任何时刻只能有一个unique_ptr指向特定的对象;weak_ptr:为解决shared_ptr对象相互引用导致对象无法释放,衍生出weak_ptr,只使用内置指针...class Foo { public: Foo(); Foo(Foo& other); // 拷贝构造函数必须使用引用,避免循环拷贝};赋值构造函数:重载运算符=...,一般运算符=号返回左侧运算对象的引用

92230

【Example】C++ 运算符重载

首先,阅读之前要先搞清楚什么是运算符、函数重载。函数重载就是在一个范围内为一个函数声明多个实现方式,函数名必须一致。 那么C++运算符是否可以重载呢?可以!...先弄清什么时候需要进行运算符重载: 假设,你有一个类或者结构体,想通过 +、-、*、/ 这种最基本的运算符直接进行计算,又或者想用 ==、|| 直接进行比较。 这时候运算符重载的作用就来了。...C++运算符重载的核心是:operator 关键字 C++当中的运算符重载是通过 operator 关键字来实现的,当你定义了类或结构体后,编译器肯定无法智能地对类本身进行运算及比较。...下面一段代码是在一个类对 = 进行了一个最简单的重载: void operator=(const DataPack &in) { this->name = in.name; this...【Example】C++ 回调函数及 std::function 与 std::bind 【Example】C++ 运算符重载 【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

70630

C++:智能指针

(2)采用这种方式,对象所需的资源在其生命期内始终保持有效 1.3 智能指针的基本框架 既然是指针,还得像指针一样去使用,因此在模版我们必须重载一下*和->的运算符。...1.5 unique_ptr C++11开始提供更靠谱的unique_ptr unique_ptr的实现原理:简单粗暴的防拷贝(不让你拷贝) 此时有两种思路: (1)只声明不定义:使得默认构造无法生成并且没有函数定义...unique_ptr(const unique_ptr& sp) = delete; //赋值重载 unique_ptr& operator=(const unique_ptr&...在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。 3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源; 4....C++ TR1,引入了shared_ptr等。不过注意的是TR1并不是标准版。 4. C++ 11,引入了unique_ptr和shared_ptr和weak_ptr。

7100

C语言 | C++常见面试题

29 new/delete与malloc/free的区别是什么 30 说一说extern“C” 31 请你来说一下 C++ struct和class的区别 32 C++ 类内可以定义引用数据成员吗?...33 C++ 类成员的访问权限 34 什么是右值引用,跟左值又有什么区别?...35 面向对象的三大特征 36 说一说 c++ 四种cast转换 37 C++ 的空类有哪些成员函数 38 对 c++ 的smart pointer四个智能指针:shared_ptr,unique_ptr...,weak_ptr,auto_ptr的理解 39 说说强制类型转换运算符 40 谈谈你对拷贝构造函数和赋值运算符的认识 41 在 C++ 使用 malloc申请的内存能否通过delete释放?...42 用 C++ 设计一个不能被继承的类 43 C++ 自己实现一个String类 44 访问基类的私有虚函数 45 对虚函数和多态的理解 46 简述类成员函数的重写、重载和隐藏的区别 47 链表和数组有什么区别

1.2K98

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

一、智能指针起因   在C++,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。   ...注意事项:   (1) 其构造函数被声明为explicit,因此不能使用赋值运算符对其赋值,即不能使用类似这样的形式 auto_ptr p = new int;   (2) auto_ptr...auto_ptr是最早期的智能指针,在C++11 已被弃用,C++17 移除,建议使用unique_ptr代替auto_ptr。...,因为它不具有普通指针的行为,没有重载operator * 和 ->,它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。...unique_ptr是通过指针占有并管理另一对象,并在unique_ptr离开作用域时释放该对象的智能指针。

50730

C++系列笔记(六)

【导读】《21天学通C++》这本书通过大量精小短悍的程序详细而全面的阐述了C++的基本概念和技术,包括管理输入/输出、循环和数组、面向对象编程、模板、使用标准模板库以及创建C++应用程序等...运算符类型和运算符重载   C++运算符从语法层面来看,除使用关键字operator外,运算符与函数几乎没有差别。...C++运算符分为单目运算符和双目运算符。...解除引用运算符和成员选择运算符   智能指针使用引用运算符和(->)成员选择运算符,需要添加头文件#include。智能指针类std::unique_ptr实现了上述用法。...函数运算符用于标准模板库(STL),通常是 STL算法。其用途包括决策。根据使用的操作数数量,这样的函数对象通常称为单目谓词或双目谓词。

25910

C++修炼之路】32.智能指针

智能指针在C++已有现成的可以使用,比如auto_ptr, weak_ptr, share_ptr, unique_Ptr等,这些针对上述拷贝的问题都有不同的方法解决: 3.3 std::auto_ptr...对*和->运算符进行重载,使auto_ptr对象具有指针一样的行为。 在拷贝构造函数,用传入对象管理的资源来构造当前对象,并将传入对象管理资源的指针置空。...简易版的unique_ptr的实现步骤如下: 在构造函数获取资源,在析构函数释放资源,利用对象的生命周期来控制资源。 对*和->运算符进行重载,使unique_ptr对象具有指针一样的行为。...在析构函数,将管理资源对应的引用计数–,如果减为0则需要将该资源释放。 对*和->运算符进行重载使用shared_ptr对象具有指针一样的行为。...对*和->运算符进行重载,使weak_ptr对象具有指针一样的行为。

20750

C++知识体系总结:语言核心与代码工程

/多态/运算符重载是对象对象的核心特征,IOStream作为官方库标准库,是使用面向对象的典范 ✧ 泛型编程:基于template的编程,可能是C++最强大的地方,这是一种和面向对象完全不同的思维方式,..., std::unique_ptr类的拷贝构造函数和赋值运算符(operator=)被标记为delete。...右值引用与移动构造函数 本节参考: 程序喵大人:左值引用、右值引用、移动语义、完美转发,你知道的不知道的都在这里 作用:右值引用与std::move结合,减少对象拷贝 附:move函数实现 1.7...运算符重载C++面向对象精华) ✓ 知识点梳理 代码示例 代码:https://github.com/lxn7022/learn-and-practice/tree/master/c%2B%2B...包展开:参数包只有在使用时就必須把它展开变成一个个的参数,概念上称为**包展开(pack expansion)**,将参数包当作普通的参数一样放到被调用函数的参数列表的最后一个位置,并在后面加上 ...

54241
领券