1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露.智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : st…
1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> p1; //指向string的shared_ptr shared_ptr<list<int>> p2; //指向int的list的shared_ptr 使用make_shared函数分配一个对象并初始化它,make_shared函数返回一个指向此对象的shared_ptr: //指向…
C++中的智能指针首先出现在“准”标准库boost中.随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象.在新标准中,主要提供了shared_ptr.unique_ptr.weak_ptr三种不同类型的智能指针.接下来的几篇文章,我们就来总结一下这些智能指针的使用. 今天,我们先来看看shared_ptr智能指针. shared_ptrshared_ptr是一个引用计数智能指针,用于共享对象的所有权也就是说它允许多个指针指向同一个对象.这一…
上篇博客我们模拟实现了 auto_ptr 智能指针,可我们说 auto_ptr 是一种有缺陷的智能指针,并且在C++11中就已经被摈弃掉了.那么本章我们就来探索 boost库和C++11中的智能指针以及其实现方法. 文章目录: 一.独占型智能指针 scope_ptr 二.强 智能指针shared_ptr 三.弱 智能指针 weak_ptr 注:在本文中模拟的智能指针并不与库中的智能指针的实现完全相同,只是为了通过探究其实现原理而进行的一种模拟. 一.独占型智能指针 scope_ptr 在 boo…
将右值引用用于一级指针,在初始化时等号右边必须为右值,有以下几种用法: //方式一:引用一级指针,常规用法 int a = 5; int * &&rrpa = &a; //右值:例子一 int * getPx() { return new int; } int * &&rrpa = getPx(); //右值:例子二 int * pa = &a; int * &&rrpa = std::move(pa);//右值:例子三 //方式二:引用指向…
转自:https://liam0205.me/2016/12/11/rvalue-reference-in-Cpp/ 最近在改 XGBoost 的代码.XGBoost 在代码中使用了很多来自 C++11 标准中的特性,让我比较好奇和困惑的,就有其中关于右值引用的部分.涉及到代码里,有比较明显的两类用法: std::move 1 std::move(foo) std::unique_ptr 1 std::vector<std::unique_ptr<T>> 前者是使用 std::mo…
简介 关于C++中的右值引用的详细可以看这一批博文<从4行代码看右值引用>.那一篇博文详细结合四行简单的代码详细介绍了右值引用的使用方法和一些场景,非常实用. 而本篇博文主要介绍一下我在学习右值引用的一些心得.因为在学习右值引用的时候,有一些地方非常难理解.所以写下这一篇博文,防止遗忘,由于对于C++涉猎不多,所以有一些不正确的地方,欢迎斧正. 为什么要使用右值引用? 对于普通开发者来说,右值引用的好处在于可以将保证在取用函数返回值的时候,减少一次复制的机会.如: #include <i…
看了一下这种方法的介绍,个人感觉,右值引用,更像人类的思想了,有些将编译前与编译后结合紧密的感觉. 左值引用是变量名的别名,右值引用是值的别名,也就是不将值赋给一个变量名所在的地址,直接将值所在的初始的地址位置,转给右值引用变量名. 这个好比是这样,一个人来图书馆送书,管理员没有将书送到指定的书架,而是在送书地点,直接将书架,架起来,包住这本书.这样的好处,我想只有一点,就是在编译时,节约内存占用,而在编译后的代码中,右值引用变量所在的代码位置上,是立即数,而不是寄存器或是地址值,从而加快了运行…
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如果你有一个右值引用类型的参数,你就知道这个被绑定的对象可以被move: class Wdiget{ Widget(Widget&& rhs); // rhs肯定指向一个有资格被move的对象 ... }; 在这种情况下,你会想传这样一个对象给其他函数,来允许这些函数能利用对象的右值属性.为了达…
作者:Tinro链接:https://www.zhihu.com/question/22111546/answer/30801982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 右值引用是C++11中最重要的新特性之一,它解决了C++中大量的历史遗留问题,使C++标准库的实现在多种场景下消除了不必要的额外开销(如std::vector, std::string),也使得另外一些标准库(如std::unique_ptr, std::function)成为可能.即使…