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

Modern C++ 最核心变化是什么?

C++ 设计者们注意到,大多数情况下,右值所包含对象都是可以安全移动。 右值(相对应还有左值)是从 C 语言设计时就有的概念,但因为如此基础,也是一个最常被忽略概念。...不严格来说,左值对应变量存储位置,而右值对应变量值本身。C++ 中右值可以被赋值左值或者绑定到引用。类右值是一个临时对象,如果没有被绑定到引用,在表达式结束就会被废弃。...3.接收右值表达式 没有移动语义,以表达式值(例为函数调用)初始化对象或者对象赋值是这样: vector str_split(const string& s); // 返回vector...vector v = str_split("1,2,3");  vector v2; // 返回vector被复制对象v(拷贝赋值操作符)。...vector v = str_split("1,2,3");  vector v2; // 返回vector被移动对象v(移动赋值操作符)。

95921

C++智能指针

每次创建智能指针,初始化智能指针并将引用计数置为1;当智能指针q赋值另一个智能指针r,即r=q,拷贝构造函数拷贝智能指针并增加q指向对象引用计数,递减r原来指向对象引用计数。...也就是说对一个智能指针进行赋值赋值操作符减少左操作数所指对象引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象引用计数。...*操作符; (3)智能指针在其声明周期结束自动销毁管理对象; (4)引用计数、写复制、赋值即释放对象拥有权限、控制权限转移。... u_i2(new int(4));//创建指定动态对象 unique_ptr u(d); //创建空unique_ptr,执行类型为T对象,用类型为D对象d来替代默认删除器...在unique_ptr为右值,可将其赋shared_ptr,这与将一个unique_ptr另一个unique_ptr需要满足条件相同,即unique_ptr必须是一个临时对象

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

STL四种智能指针

unique_ptr指针与其所指对象关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权... u_i2(new int(4));//创建指定动态对象 unique_ptr u(d); //创建空unique_ptr,执行类型为T对象,用类型为D对象d来替代默认删除器...功能和用法类似于unique_ptr,由 new expression 获得对象,在 auto_ptr 对象销毁,他所管理对象也会自动被 delete 掉。...(加1); (3)使用赋值操作符对一个智能指针类对象进行赋值,处理复杂一点:先使左操作数引用计数减1(为何减1:因为指针已经指向别的地方),如果减1后引用计数为0,则释放指针所指对象内存。...在unique_ptr为右值,可将其赋shared_ptr,这与将一个unique_ptr另一个unique_ptr需要满足条件相同,即unique_ptr必须是一个临时对象

2.7K41

C++智能指针unique_ptr、shared_ptr和weak_ptr

这意味着在任何时候只有一个unique_ptr可以指向一个特定对象。 自动释放内存:当unique_ptr超出作用域或被重新赋值,它所管理内存会自动释放。这样就避免了内存泄漏问题。...支持移动语义:unique_ptr支持移动构造和移动赋值操作,可以将所有权转移unique_ptr,而无需进行内存拷贝。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存执行额外清理操作。...通过移动构造函数将所有权转移另一个unique_ptr std::unique_ptr ptr2 = std::move(ptr); // 注意,此时ptr已经为空指针,...只有当所有shared_ptr都超出作用域或被重新赋值,才会释放所管理内存。 自动释放内存:当最后一个指向对象shared_ptr超出作用域或被重新赋值,它会自动释放所管理内存。

48220

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

+指针算法 唯一指针不可使用赋值语法进行初始化,应使用普通指针初始化 唯一指针可以为空 release()可以让唯一指针返回拥有的对象,并失去指向该对象唯一性,调用release()指针将指向返回对象...必须自定义删除器 定义删除器方法是必须将删除器类型指定为第二个模板参数 删除器类型可以是函数、函数指针或函数对象 unique_ptr uq(new int...~shared_ptr() 析构函数;如果sp拥有对象,则调用deleter sp = sp2 赋值(sp之后与sp2共享所有权,放弃先前拥有的对象所有权) sp = move(sp2) 移动赋值(sp2...将所有权转移到sp) sp = move(up) 使用unique_ptr进行移动赋值(up将所有权转让给sp) sp = move(ap) 使用auto_ptr进行移动赋值(ap将所有权转让给sp)...~unique_ptr() 析构函数;调用拥有者对象删除器 up = move(up2) 移动赋值(up2将所有权转移到up) up = nullptr 调用拥有者对象删除器,并使其为空(等同于up.reset

1.5K20

C++智能指针学习(一)

std::auto_ptr 真正让人容易误用地方是不常用复制语义,即当复制一个 std::auto_ptr 对象(拷贝复制或 operator= 复制),原对象所持有的堆内存对象也会转移复制出来对象...2、std::unique_ptr: 作为对 std::auto_ptr 改进,std::unique_ptr持有的堆内存具有唯一拥有权,也就是 std::unique_ptr 不可以拷贝或赋值其他对象...既然 std::unique_ptr 不能复制,那么如何将一个 std::unique_ptr 对象持有的堆内存转移另外一个呢?...3、自定义智能指针对象持有的资源释放函数: 默认情况下,智能指针对象在析构只会释放持有的堆内存(调用 delete 或者 delete[]),但是假设这块堆内存代表对象还对应一种需要回收资源(...其中 T 是你要释放对象类型,DeletorPtr 是一个自定义函数指针。

71820

现代C++之手写智能指针

赋值函数中参数类型 unique_ptr& 改成了 unique_ptr,在构造参数直接生成新智能指针,从而不再需要在函数体中构造临时对象。...现在赋值函数行为是移动还是拷贝,完全依赖于构造参数移动构造还是拷贝构造。...拷贝赋值操作符,用户自定义移动操作会导致不生成默认拷贝赋值操作,其它和C++98行为一致。 移动构造函数和移动赋值操作符,仅仅在没有用户自定义拷贝操作,移动操作和析构操作时候才会生成。...auto_ptr是可以说你随便赋值,但赋值完了之后原来对象就不知不觉报废.搞得你莫名妙。...但是,一个对象只能被单个 unique_ptr所拥有,这显然不能满足所有使用场合需求。一种常见情况是,多个智能指针同时拥有一个对象;当它们全部都失效,这个对象也同时会被删除。

2.8K10

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

二、智能指针类型 智能指针在C++11版本之后提供,包含在头文件中,标准命名std空间下,有auto_ptr、shared_ptr、weak_ptr、unique_ptr四种,其中auto_ptr...2.1 auto_ptr auto_ptr是通过由 new 表达式获得对象,并在auto_ptr自身被销毁删除该对象智能指针,它可用于为动态分配对象提供异常安全、传递动态分配对象所有权函数和从函数返回动态分配对象...注意事项:   (1) 构造函数被声明为explicit,因此不能使用赋值运算符对赋值,即不能使用类似这样形式 auto_ptr p = new int;   (2) auto_ptr...对象所有权是独占性,使用拷贝构造和赋值操作符,会造成对象所有权转移,被拷贝对象在拷贝过程中被修改;   (3) 基于第二条,因此不能将auto_ptr放入到标准容器中或作为容器成员;   (4...unique_ptr使用标志着控制权转移,同一刻只能有一个unique_ptr指向给定对象,通过禁止拷贝语义、只有移动语义来实现。

51730

c++11&14-智能指针专题

什么是智能指针 简单地说,智能指针是用对象去管理一个资源指针,同时用一个计数器计算引用当前指针对象个数,当管理指针对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁,计数器为1,...1.1 std::shared_ptr std::shared_ptr包装了new操作符动态分配内存,可以自由拷贝复制,基本上是使用最多一个智能指针类型。...与sp指向相同对象weak_ptr, T必须能转换为sp指向类型 w = p; //p可以是shared_ptr或者weak_ptr,赋值后w和p共享对象 w.reset(); //weak_ptr...up; //error, can not be assigned 1.3.3 unique_ptr可以移动赋值或者移动拷贝 unique_ptr pT(new T()); unique_ptr<...只能有一个引用,不能赋值或者拷贝,但可以移动赋值移动拷贝,std::weak_ptr实际上是对std::shared_ptr补充,它并不能对对象进行具体操作。

62140

智能指针探究

需要注意是,使用 std::move 函数并不会移动对象或释放资源。它只是将左值转换为右值引用,以便可以使用移动构造函数或移动赋值运算符来转移对象所有权。...当你使用std::move函数将一个unique_ptr对象转化为右值引用并将其赋值另一个unique_ptr对象来初始化时,就会调用这个运算符 第三行代码创建一个unique_ptr对象p1...这样p1所有权转移p2,p1变为空指针 三四行代码,不涉及构造赋值运算符,只涉及到移动构造函数 这时候肯定会说,那和auto_ptr也一样啊,但unique_ptr p2(std::move...当使用new操作符创建一个新对象,会为该对象分配内存,并调用构造函数来初始化它。当不再需要这个对象,应该使用delete操作符来删除它。...构造函数来创建一个新shared_ptr对象,然后这个新创建shared_ptr对象赋值变量pa 这也就是说变量pa是一个shared_ptr类型对象,它指向一个新创建

6310

详解 C++ 11 中智能指针

std::auto_ptr 真正让人容易误用地方是不常用复制语义,即当复制一个 std::auto_ptr 对象(拷贝复制或 operator = 复制),原对象所持有的堆内存对象也会转移复制出来对象...既然 std::unique_ptr 不能复制,那么如何将一个 std::unique_ptr 对象持有的堆内存转移另外一个呢?...并不是所有的对象 std::move 操作都有意义,只有实现了移动构造函数(Move Constructor)或移动赋值运算符(operator =)类才行,而 std::unique_ptr 正好实现了这二者...自定义智能指针对象持有的资源释放函数 默认情况下,智能指针对象在析构只会释放持有的堆内存(调用 delete 或者 delete[]),但是假设这块堆内存代表对象还对应一种需要回收资源(如操作系统套接字句柄...T 是你要释放对象类型,DeletorPtr 是一个自定义函数指针。

2.7K31

C++11新特性学习笔记

通过转移语义,临时对象资源能够转移其它对象里。 7.2.2 移动语义定义 在现有的 C++ 机制中,我们可以定义拷贝构造函数和赋值函数。...要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。对于右值拷贝和赋值会调用转移构造函数和转移赋值操作符。...8.1 unique_ptr unique_ptr持有对对象独有权,同一刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。...unique_ptr指针本身生命周期:从unique_ptr指针创建开始,直到离开作用域。 离开作用域,若指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。...成员lock,则可返回指向内存一个share_ptr对象,且在所指对象内存已经无效,返回指针空值nullptr。

2.2K20

MSVC std::unique_ptr 源码解析

在离开作用域,所保存对象会自动销毁: std::cout << "block begin" << std::endl; { auto p = std::make_unique<LifeCycleTestClass...unique_ptr; 这里模板参数 _Ty 是保存对象类型,_Dx 是删除器类型,默认为 default_delete,下面是具体定义: template struct...,deleter_type 为删除器类型,我们主要关注 pointer,pointer 类型由 _Get_deleter_pointer_type 决定,我们可以发现它有两个定义,前者是默认定义,当删除器中没有定义...总结 std::unique_ptr 有两个定义,分别针对普通类型和数组类型 std::unique_ptr 第二个模板参数是删除器,不传递情况下使用是 default_delete std::unique_ptr...重载了指针、数组相关操作符,实现与裸指针类似的操作 std::unique_ptr 不允许拷贝,语义上表示一段内存所有权,转移所有权需要使用 std::move 产生移动语义 std::unique_ptr

1.5K10

C++基础 智能指针

可视作auto_ptr替代品 持有对象**独有权**,同一刻只能有一个unique_ptr指向给定对象 shared_ptr 允许多个该智能指针**共享**堆中分配内存(指向同一对象),通过*...对于特定对象,同一刻只能有一个智能指针可拥有, 最终只有拥有对象智能指针构造函数会删除该对象,auto_ptr和unique_ptr就是采用这种策略 创建智能更高指针,跟踪引用特定对象智能指针个数...因为shared_ptr采用引用计数,当执行完赋值语句py = px后,px和py都指向同一块内存,只不过在释放空间因为事先要判断引用计数值大小,因此不会出现多次删除一个对象错误。...选择使用参考 如果程序中要使用多个指向同一个对象指针,那么应该使用shared_ptr 比如说现在有一个包含指针STL容器,现在用某个支持复制和赋值操作STL算法去操作该容器指针元素,那么就应该用...如果程序中不需要使用多个指向同一个对象指针,则可使用unique_ptr 如果函数使用new分配内存,并返回指向该内存指针,将其返回类型声明为unique_ptr是不错选择。

59320

C++11新特性学习笔记

通过转移语义,临时对象资源能够转移其它对象里。 7.2.2 移动语义定义 在现有的 C++ 机制中,我们可以定义拷贝构造函数和赋值函数。...要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。对于右值拷贝和赋值会调用转移构造函数和转移赋值操作符。...8.1 unique_ptr unique_ptr持有对对象独有权,同一刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。...unique_ptr指针本身生命周期:从unique_ptr指针创建开始,直到离开作用域。 离开作用域,若指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。...成员lock,则可返回指向内存一个share_ptr对象,且在所指对象内存已经无效,返回指针空值nullptr。

2K20

C++最佳实践 | 6. 性能

(move)操作 move操作是C++11中最受欢迎特性之一,该操作允许编译器通过移动临时对象从而避免额外拷贝。...某些代码(例如声明自己析构函数或赋值操作符或拷贝构造函数)会阻止编译器生成移动构造函数。...>(); 目前最佳实践也建议从工厂函数返回unique_ptr,然后在必要unique_ptr转换为shared_ptr。...选择float意味着精度较低,并可能由于类型转换而影响性能。在可向量化操作中,如果能够牺牲精度,float可能更快。 double是C++中浮点值默认类型,因此推荐作为默认选项。...你永远无法确定代码会不会使用不带优化编译器,因此没有任何理由不这样做。此外,编译器有可能只对整数类型进行优化,而不一定对所有迭代器或其他用户自定义类型进行优化。

74921

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

使用 unique_ptr“唯一”拥有其所指对象,同一刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。...相比与原始指针unique_ptr用于RAII特性,使得在出现异常情况下,动态资源能得到释放。unique_ptr指针本身生命周期:从unique_ptr指针创建开始,直到离开作用域。...离开作用域,若指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。...unique_ptr指针与其所指对象关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权...每次创建类对象,初始化指针并将引用计数置为1;当对象作为另一对象副本而创建,拷贝构造函数拷贝指针并增加与之相应引用计数;对一个对象进行赋值赋值操作符减少左操作数所指对象引用计数(如果引用计数为减至

1.4K30

C++|智能指针模板类

在 main 函数中每一个对象创建都使用了一对花括号 {} 来包围,这是为了控制对象生命周期,使得每个对象都在其对应作用域内被创建和销毁,防止对象生命周期超出作用域而导致未定义行为。...因此,在本代码中,每个智能指针都被包含在一个花括号内,当这个花括号结束,智能指针就会被销毁,并自动释放指向对象。...如果不使用花括号来限制作用域,而是直接在 main 函数中创建智能指针,那么这些智能指针就会在 main 函数结束才被销毁,这样就会导致智能指针指向对象生命周期超出作用域,可能引发未定义行为和内存泄漏等问题...,两个指针将同时指向同一个string对象,这显然是不能被接受,因为程序试图删除同一个对象两次,分别发生在ps和vication过期,要解决这个问题,可以考虑下面几种方案: 定义赋值运算符,使之指向深复制...如果实在需要这种赋值操作,安全重用这种指针,可以给他赋新值,这就引出了另外一个标准函数库中函数:std::move()通过它,你可以实现将unique_ptr赋值另外一个。

61010

性能大杀器:c++中copy elision

,多了很多,现在我们着手分析下原因,以Obj o1(CreateObj1());为例: •调用CreateObj1()函数,创建一个临时对象并返回,此时会输出Default ctor•将上述需要返回临时对象以拷贝方式赋值函数返回值...,此时会输出Default ctor•修改临时变量temp成员变量x_值为2•temp以拷贝方式赋值函数返回值,此时会输出Copy ctor•函数返回值作为obj2拷贝对象,此时会输出Copy...volatile命名对象类型与函数返回类型相同时,编译器可以优化掉拷贝或移动操作,直接将自动对象构造到函数调用返回对象中。...这意味着,当函数返回一个自动对象,编译器可以优化掉不必要拷贝或移动操作,直接将自动对象构造到函数调用返回对象中,以提高效率。这种优化在 C++ 标准中被明确规定,以支持更高效代码生成。...标准这一规定,使得原本不支持拷贝对象,作为函数返回值,也成了可能。

10710

C++智能指针

这三种类型定义在memeory头文件中。 原理: 将我们分配动态内存都交给有生命周期对象来处理,当对象过期,让它析构函数删除指向内存。...auto_ptr C++98智能指针模板,定义了管理指针对象,可以将new获得(直接或间接获得)地址赋值这种对象。当对象过期析构函数会用delete来释放内存。...不会自动释放指针指针。 3.除非自己知道后果,不要把auto_ptr 智能指针赋值类型另外一个智能指针,解释如下。...构造函数 unique_ptr up ; //空unique_ptr,可以指向类型为T对象 unique_ptr up(new T()) ;//定义unique_ptr,同时指向类型为T...对象 unique_ptr up ; //空unique_ptr,可以指向类型为T数组对象 unique_ptr up(new T[]) ;//定义unique_ptr,同时指向类型

40520

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券