c++11 shared_ptr & unique_ptr & move semantics(右值引用)

just read it

smart_ptr: https://mbevin.wordpress.com/2012/11/18/smart-pointers/

使用任何指针是都要考虑ownership+memory-management+lifetime这几个问题。

who is the owner of this object? is there one owner or many? who will responese for the deletion?

使用unique_ptr则表示该对象为owner,但可以转移(std::move)

plain pointers should never be used to act as the ‘owners’ of objects

尽可能多的使用shared_ptr,在环形引用时考虑weak_ptr(不会增加只针的引用计数)

创建一个对象后立即赋值给shared_ptr或者unique_ptr,函数返回普通指针时,也立即将普通指针赋值给智能指针,以保证自动内存管理

智能指针对象直接以值的形式保存在container中,而不是指针或者引用,以传值方式传递函数参数,函数以值返回等(std::move,右值引用)。

使用 shared_ptr是多线程安全的,但是shared_ptr本身不是多线程安全。即,在多线程中使用智能指针时,每个线程都应该有一个shared_ptr对象,而不是多个线程使用同一个shared_ptr对象。

move: https://mbevin.wordpress.com/2012/11/20/move-semantics/

move 与 std模板容器的应用:

to be continued…

时间: 2024-10-28 18:54:15

c++11 shared_ptr & unique_ptr & move semantics(右值引用)的相关文章

【C++11新概念】:右值引用

C语言原始定义:在C语言中表示位于赋值运算符两侧的两个值,左边的就叫左值,右边的就叫右值. 左值: 地址,内存中的具体空间,可以被读写:例如变量 左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储 右值: 数据,例如1,‘哈哈哈哈’ 右值指的是引用了一个存储在某个内存地址里的数据.不能通过引用或指针读写.用户无法控制这个右值. 一个区分左值和右值的方法是:能不能对这个值取地址. return语句: 按照以前C的说法,return语句如果是按值传递的话,re

右值引用,转移语义与完美转发

1. 左值与右值: C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:可以取地址的,有名字的,非临时的就是左值;不能取地址的,没有名字的,临时的就是右值. 可见立即数,函数返回的值等都是右值;而对象(包括变量),函数返回的引用,const对象等都是左值. 从本质上理解,创建和销毁由编译器幕后控制的,程序员只能确保在本行代码有效的,就是右值(包括立即数);而用户创建的,通过作用域规则可知其生存期的,就是左值(包括函数返回的局部变量的引用以及const对象),例如: int& foo()

C++11的右值引用

右值引用是C++11         引入的新特性.它解决了两类问题:实现移动语义和完美转发.本文大绝大部分内容,来自于文章:http://kuring.me/post/cpp11_right_reference/ 一:左值(lvalue)和右值(rvalue) 最初,在C中,左值和右值的定义如下:左值,是一个可以出现在赋值操作符左边或者右边的表达式:而右值是只能出现在赋值操作符右边的表达式.比如: int a = 42; int b = 43; // a and b are both l-va

深入右值引用,move语义和完美转发

深入右值引用,move语义和完美转发 转载请注明:http://blog.csdn.net/booirror/article/details/45057689 乍看起来,move语义使得你可以用廉价的move赋值替代昂贵的copy赋值,完美转发使得你可以将传来的任意参数转发给 其他函数,而右值引用使得move语义和完美转发成为可能.然而,慢慢地你发现这不那么简单,你发现std::move并没有move任何东西,完美转发也并不完美,而T&&也不一定就是右值引用-- move语义 最原始的左值

c++11 右值引用

http://blog.csdn.net/cpd92/article/details/50651700 http://www.tuicool.com/articles/i2qyyyB move 就是右值引用,减少了copy和释放的过程,提高了程序性能. #include <iostream> #include <string> #include<vector> using namespace std; class MyString { private: char* _d

c++11——右值引用

1. 左值和右值 左值是表达式结束之后仍然存在的持久化对象,而右值是指表达式结束时就不再存在的临时对象.     c++11中,右值分为两种类型:将亡值(xvalue, expiring value),另一个是纯右值(prvalue, pure rvalue). 非引用返回的临时变量.运算表达式产生的临时变量.原始字面量和lambda表达式等都是纯右值:将亡值是c++11新增的.与右值引用相关的表达式,比如,将要被移动的对象.T&&函数返回值.std::move返回值和转换为T&&

C++11新特性:右值引用和转移构造函数

问题背景 [cpp] view plaincopy #include <iostream> using namespace std; vector<int> doubleValues (const vector<int>& v) { vector<int> new_values( v.size() ); for (auto itr = new_values.begin(), end_itr = new_values.end(); itr != end

C++11线程指南(四)--右值引用与移动语义

1. 按值传递 什么是按值传递? 当一个函数通过值的方式获取它的参数时,就会包含一个拷贝的动作.编译器知道如何去进行拷贝.如果参数是自定义类型,则我们还需要提供拷贝构造函数,或者赋值运算符来进行深拷贝.然而,拷贝是需要代价的.在我们使用STL容器时,就存在大量的拷贝代价.当按值传递参数时,会产生临时对象,浪费宝贵的CPU以及内存资源. 需要找到一个减少不必要拷贝的方法.移动语义就是其中一种. 2. 右值引用 此处介绍右值引用的目的,是为了实现后面的移动语义. 右值引用使得我们可以分辨一个值是左值

[转载] C++11中的右值引用

C++11中的右值引用 May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导规则 特殊模板参数推导规则 解决完美转发问题 引用 在C++98中有左值和右值的概念,不过这两个概念对于很多程序员并不关心,因为不知道这两个概念照样可以写出好程序.在C++11中对右值的概念进行了增强,我个人理解这部分内容是C++11引入的特性中最难以理解的了.该特性的引入至少可以解决C++98中的