本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr类似的智能指针,但是,它们不参加被指向资源的共享所有权管理.换句话说,这是一个行为像std::shared_ptr,但却不影响对象引用计数的指针.这样的智能指针需要与一个对std::shared_ptr来说不存在的问题做斗争:它指向的东西可能已经被销毁了.一个真正的智能指针需要通过追踪资源的悬挂(也…
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移问题.这导致多个std::auto_ptr类型的局部变量不能共享同一个资源,这个问题是非常严重的哦.因为,我个人觉得,智能指针内存管理要解决的根本问题是:一个堆对象(或则资源,比如文件句柄)在被多个对象引用的情况下,何时释放资源的问题.何时释放很简单,就是在最后一个引用它的对象被释放的时候释放它.关…
std::weak_ptr 避免shared_ptr内存泄漏的利器.…
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象. 进行该对象的内存管理的是那个强引用的 shared_ptr. weak_ptr只是提供了对管理对象的一个访问手段. 为了解决std::shared_ptr在相互引用的情况下出现的问题而存在的, std::shared_ptr赋值给weak_ptr时,weak_ptr 支持拷贝或赋值,不会引起智能指针计数增加. weak_ptr.lock() 获取所管理的对象的强引用(shared_ptr) w…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_shared的对比开始吧.std::make_shared是C++11的部分,但是,不幸的是,std::make_unique不是.它是在C++14中才被加入到标准库的.如果你使用的是C++11,不要怕,因为一个std::make_unique的基础版本很容易写.看这里: template<typen…
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智能指针 4. weaked_ptr: 到 std::shared_ptr 所管理对象的弱引用 1.1 weak_ptr 参考:https://zh.cppreference.com/w/cpp/memory/weak_ptr std::weak_ptr 是一种智能指针,它对被 std::shared…
先说明一点:std::asyanc是std::future的高级封装, 一般我们不会直接使用std::futrue,而是使用对std::future的高级封装std::async. 下面分别说一下. 一.std::async基本用法 std::future可以从异步任务中获取结果,一般与std::async配合使用,std::async用于创建异步任务,实际上就是创建一个线程执行相应任务. std::async就是异步编程的高级封装,封装了std::future的操作,基本上可以代替std::t…
std::future和std::promise std::future std::future期待一个返回,从一个异步调用的角度来说,future更像是执行函数的返回值,C++标准库使用std::future为一次性事件建模,如果一个事件需要等待特定的一次性事件,那么这线程可以获取一个future对象来代表这个事件. 异步调用往往不知道何时返回,但是如果异步调用的过程需要同步,或者说后一个异步调用需要使用前一个异步调用的结果.这个时候就要用到future. 线程可以周期性的在这个future上…
1.std::move 1.1std::move是如何定义的 template<typename _Tp> constexpr typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) noexcept { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }…
背景 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢,导致程序出现未定义或异常行为.通常的做法是在修改共享数据成员时进行加锁(mutex).在使用锁时通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,但经常会出现lock之后离开共享成员操作区域时忘记unlock导致死锁的现象.针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构.通过对lock和unloc…