OVP 过压保护芯片 OVP 过压保护 IC: 为了保护后级电路, 平芯微早早推出了系列 OVP 过压保护芯片产品, 很多客户对于 OVP 过压保护芯片的功能和使用仍然存在一些误解。...这次我们平芯微就针对 OVP 过压保护芯片功能使用做详细的描述和介绍。 首先我们需要先看下芯片规格书的描述(如下图) , 有一定了解后, 我们再往下给大家讲解。...如: TWS 耳机, 电子烟这种靠近人头部使用产品, 更需要平芯微的过压保护芯片提高安全性和质量可靠性。...在过压保护芯片产品使用中, 很多使用在锂电池充电芯片前面做保护左右, 为了节省 PCB 设计和成本。
当使用原始指针构造或初始化 shared_ptr 时,会创建一个新的控制块。...在可能的情况下,尽量使用 std::make_shared(或 std::allocate_shared)来减少发生此错误的可能性。...以下是它的一个基本示例: #include struct Foo : std::enable_shared_from_this { std::shared_ptr<Foo...类初识 std::enable_shared_from_this 的实现是一个类,它只包含一个 weak_ptr 字段(通常称为 _M_weak_this),这里面有很多细节:看看你知道吗?...当我们使用了shared_from_this(),在private会报异常。
中 erase 掉,时并不会马上 析构TcpConnection 对象(引用计数不为0), 因为此时正处于Channel::handleEvent() 中,如果析构了TcpConnection,那么它的成员...() 的使用: class TcpConnection : boost::noncopyable, public boost::enable_shared_from_this q = p->f(); Y *r = p->f2(); assert(p == q); assert(p.get() == r); std...::cout << p.use_count() << std::endl; //2 boost::shared_ptr s(r); std::cout << s.use_count...()); } channel_->remove(); //poll 不再关注此通道 } 参考: 《UNP》 muduo manual.pdf 《linux 多线程服务器编程:使用
它通过继承和模板的联合应用,实现了一种"看似"继承自己的语法。这种编程的技法,无论是在STL还是Boost之中都被大量使用。像它的名字一样,看起来很Curiously。...它的能够规避上述问题的原因如下: 通过自身维护了一个std::weak_ptr让所有从该对象派生的shared_ptr都通过了std::weak_ptr构造派生。...这种用法很常见,笔者常用的Boost.operators同样也使用了CRTP,通过继承其中的boost::less_than_comparable, 可以很轻松的替代std::rel_ops...所以本节笔者就结合自己本身的实践,来描述一下CRTP应该如何在实际的编码场景之中使用,以及能够解决一些什么样的问题。...本篇介绍了一个模板使用的黑魔法:CRTP。它在高性能数据库,金融系统领域作为一种编程技法被大量使用。但是由于其怪异的语法,坦率来说对初学者并不友好。
C++ 中使用 std::shared_ptr 智能指针不当有可能会造成循环引用,因为 std::shared_ptr 内部是基于引用计数来实现的, 当引用计数为 0 时,就会释放内部持有的裸指针。...data_fetcher_) { data_fetcher_ = std::make_shared(shared_from_this()); } std::cout...可以看到,在构造 DataFetch 的时候, 我们使用了 shared_from_this() 作为参数: data_fetcher_ = std::make_shared(...shared_from_this()); 它是 std::enable_shared_from_this 类的一个方法。...因为我们继承了 std::enable_shared_from_thi,因此就可以拿到这个方法,它返回的是一个当前指针的 std::shared_ptr. 那么它是怎么实现的呢?
std::weak_ptr 可以从一个 std::shared_ptr 或另一个 std::weak_ptr 对象构造,std::shared_ptr 可以直接赋值给 std::weak_ptr ,也可以通过...它的构造和析构不会引起引用计数的增加或减少。...既然,std::weak_ptr 不管理对象的生命周期,那么其引用的对象可能在某个时刻被销毁了,如何得知呢?...因此,std::weak_ptr 的正确使用场景是那些资源如果可能就使用,如果不可使用则不用的场景,它不参与资源的生命周期管理。...,只有了解它的内部实现,对于使用中的一些坑才能有效避免。
c++11引入了三种智能指针: std::shared_ptr std::weak_ptr std::unique_ptr shared_ptr shared_ptr使用了引用计数,每一个shared_ptr...; return 0; } 上面代码,产生了循环引用,导致aptr和bptr的引用计数为2,离开作用域后aptr和bptr的引用计数-1,但是永远不会为0,导致指针永远不会析构,产生了内存泄漏,如何解决这种问题呢...,答案是使用weak_ptr。...weak_ptr weak_ptr是用来监视shared_ptr的生命周期,它不管理shared_ptr内部的指针,它的拷贝的析构都不会影响引用计数,纯粹是作为一个旁观者监视shared_ptr中管理的资源是否存在...使用方法和shared_ptr类似,区别是不可以拷贝: using namespace std; struct A { ~A() { cout << "A delete" << endl
在这里可以下载到所使用的数据集。在这篇文章中我会重复的展示数据集中的一部分特点,并且展示我们在过采样的情况下该如何进行合适的交叉验证。...如预期的那样,分类器的偏差太大,召回率为零或非常接近零,而真假率为1或非常接近于1,即所有或几乎所有记录被检测为会正常分娩,因此基本没有识别出早产的记录。下面的实验则使用了欠采样的方法。...正确的使用过采样和交叉验证 正确的在交叉验证中配合使用过拟合的方法很简单。就和我们在交叉验证中的每次循环中做特征选择一样,我们也要在每次循环中做过采样。...如之前所说,更多的数据并没有解决任何的问题,对于使用“智能”的过采样。它带来了非常高的精确度,但那是过拟合。下面是一些关于召回率和真假率指标的结果的分析和总结可以看看。 召回率 ? ? ? ?...总结 在这篇文章中,我使用了不平衡的 EHG 数据来预测是否早产,目的是讲解在使用过采样的情况下该如何恰当的进行交叉验证。关键是过采样必须是交叉验证的一部分,而不是在交叉验证之前来做过采样。
enable_shared_from_this从本质上来说解决了不能直接冲this对象构造智能指针的问题,但是使用时也需要注意,既返回的智能智能必须要通过shared_from_this()获取,当然也可以不用...1 enable_shared_from_this如何使用 class MyCar:public std::enable_shared_from_this { public: shared_ptr... get_ptr() { return shared_from_this(); } ~MyCar() { std::cout << "free ~Mycar()"...运行结果如下: 结果也和预期的一致,通过使用std::enable_shared_from_this。两次智能指针的使用增加了共享指针的引用次数。程序退出时也只进行了一次析构。...报错的内容是: 如上图所示,异常位置是在弱指针处,从C++书籍中可以知道,弱指针实际上是智能共享指针的伴随指针,它主要负责监控智能指针的声明周期,弱指针本身的构造和析构都不会对引用计数进行修改,纯粹是作为一个助手监视
然而,我之所以还向你介绍一下 std::auto_ptr 的用法以及它的设计不足之处是想让你了解 C++ 语言中智能指针的发展过程,一项技术如果我们了解它过去的样子和发展的轨迹,我们就能更好地掌握它,不是吗...既然 std::unique_ptr 不能复制,那么如何将一个 std::unique_ptr 对象持有的堆内存转移给另外一个呢?...它的构造和析构不会引起引用计数的增加或减少。...既然,std::weak_ptr 不管理对象的生命周期,那么其引用的对象可能在某个时刻被销毁了,如何得知呢?...因此,std::weak_ptr 的正确使用场景是那些资源如果可能就使用,如果不可使用则不用的场景,它不参与资源的生命周期管理。
} }; __FILE__转换成宽字符 #define WIDE2(x) L##x #define WIDE1(x) WIDE2(x) #define WFILE WIDE1(FILE)// 使用...std::wcout向控制台输出宽字符无法显示问题 --win7 std::wcout.imbue(std::locale("chs")); extern "C"的作用 extern "C"的主要作用就是为了能够正确实现...::wistringstream outBuffer(buffer);//istream VA_ARGS宏使用 #define LOG(...) { \ fprintf(stdout, "%s:Line....get(); //shared_ptr转普通指针 获取自身的std::shared_ptr 指针 继承自 std::enable_shared_from_this 调用 shared_from_this...() class FIniSection : public std::enable_shared_from_this; auto self = shared_from_this
其中 r 为 rhs(等号的右边 right-hand-side) 注意如果因误操作对原来管理的 ptr 执行这种操作 s.reset(ptr); 或 s = shared_ptr(ptr);,最后在...对于 shared_ptr,如果有 alive 的 weak_ptr 指向了它,则当 s 过期时,其 bka 并不立马析构,而是会等到 w 的析构再一起析构。...delete[] p; 而 unique_ptr 从 C++11 开始一直都可以正确处理 new[] std::enable_shared_from_this 如果类的方法想返回指向 this 的 shared_ptr...,使用return std::shared_ptr(this);是错误的。...因此,public 继承 std::enale_shared_from_this 就可以解决这个问题,使用return shared_from_this();就可以返回一个和前面已经存在的 shared_ptr
auto a = 0; //这是正确的 auto a; // 这是错误的,因为在申明时无法推导类型 a = 0; 对于decltype有如下规则 如果表达式e是一个变量,那么就是这个变量的类型。...它里面采用了引用计数器,如果计数为0,则被认为是不能再被仍和变量访问到,就会被自动delete。...一个指针智只能被一个智能指针维护 > 如果一个地址同时被两个或两个以上智能指针维护会出现什么事?...但是某些情况下我们需要返回自己的智能指针怎么办呢,又有个新玩意,std::enable_shared_from_this ,只要继承它,就有一个成员方法shared_from_this用于返回自身的智能指针...其内部使用一个weak_ptr维护,这就是weak_ptr的一个重要使用了。
std::unique_ptr 的使用比较简单,也是用得比较多的智能指针。这里直接看例子。 使用裸指针时,要记得释放内存。...只需要将裸指针用 RAII 的手法封装好就行,无需保存其它信息,所以它的开销和裸指针是一样的。...image enable_shared_from_this 一个类的成员函数如何获得指向自身(this)的 shared_ptr? 看看下面这个例子有没有问题?...image 成员函数获取 this 的 shared_ptr 的正确的做法是继承 std::enable_shared_from_this。...return shared_from_this(); } }; auto sptr1 = std::make_shared(); assert(sptr1.use_count() ==
auto a = 0; //这是正确的 auto a; // 这是错误的,因为在申明时无法推导类型 a = 0; 对于decltype有如下规则 如果表达式e是一个变量,那么就是这个变量的类型。...它里面采用了引用计数器,如果计数为0,则被认为是不能再被仍和变量访问到,就会被自动delete。...一个指针智只能被一个智能指针维护 如果一个地址同时被两个或两个以上智能指针维护会出现什么事?...但是某些情况下我们需要返回自己的智能指针怎么办呢,又有个新玩意,std::enable_shared_from_this ,只要继承它,就有一个成员方法shared_from_this用于返回自身的智能指针...其内部使用一个weak_ptr维护,这就是weak_ptr的一个重要使用了。
不能拷贝,只能移动,析构时非空的 std::unique_ptr 会销毁它的资源,默认情况下, std::unique_ptr 会对内部的原始指针使用 delete 来释放原始指针所指向的资源。...如果使用权链受到异常或其他非典型控制流中断, std::unique_ptr 管理的资源最终也会被释放,仅仅在三种条件下不会释放: 异常传播到线程主函数之外 异常出现在声明了 noexcept 的地方,...,并且在使用 this 构造 std::shared_ptr 的地方使用 shared_from_this ()函数代替 this class Widget: public std::enable_shared_from_this...,当 A 被销毁时, B 能检测到指向 A 的指针已经悬空了,而且能够正确释放 A 的内存 std::weak_ptr 和 std::shared_ptr 大小一样,它们使用相同的控制块和操作,区别仅仅在于...,仅仅申请或释放和对象大小一样的内存,而实际需要的是对象大小加上控制块大小后的内存,因此使用 std::shared_ptr 构造函数不可行,而使用 std::make_shared 函数就无法使用类自定义的
同时也解释了为什么要用shared_from_this以及智能指针的函数传参问题。 对象所有权 首先需要理清楚的概念就是对象所有权的概念。...但是明白了对象所有权,我们才可以正确管理好对象生命周期和内存问题。 C++引入了智能指针,也是为了更好的描述对象所有权,简化内存管理,从而大大减少我们C++内存管理方面的犯错机会。...对于此种场景,我们尽量使用std::move,将shared_ptr转移给新的对象。因为移动不用增加引用计数,因此性能比复制更好。 使用场景 shared_ptr通常使用在共享权不明的场景。...可以使用BlockingQueue>将对象转移到另外一个线程中释放,从而解放关键线程。 为什么要用shared_from_this?...如何指针作为函数传参 很多时候,函数的参数是个指针。
一、为什么需要使用智能指针 (一)内存泄漏 C++在堆上申请内存后,需要手动对内存进行释放。代码的初创者可能会注意内存的释放,但随着代码协作者加入,或者随着代码日趋复杂,很难保证内存都被正确释放。...就像它的名字一样,它本身是一个弱指针,因为它本身是不能直接调用原生指针的方法的。如果想要使用原生指针的方法,需要将其先转换为一个shared_ptr。那weak_ptr存在的意义到底是什么呢?...(一)智能指针如何选择 在介绍指针如何选择之前,我们先回顾一下这几个指针的特点: unique_ptr独占对象的所有权,由于没有引用计数,因此性能较好。...但这个条件本身就很难判断,在我看来可以简单的理解:这个对象在对象或方法内部使用时优先使用unique_ptr。... d1(new D(this_shared_ptr1)); //正确方式 std::shared_ptr this_shared_ptr2 = shared_from_this
一、为什么需要使用智能指针 1.1 内存泄漏 C++在堆上申请内存后,需要手动对内存进行释放。代码的初创者可能会注意内存的释放,但随着代码协作者加入,或者随着代码日趋复杂,很难保证内存都被正确释放。...,它拥有对持有对象的唯一所有权。...那具体这个唯一所有权如何体现呢?...就像它的名字一样,它本身是一个弱指针,因为它本身是不能直接调用原生指针的方法的。如果想要使用原生指针的方法,需要将其先转换为一个shared_ptr。那weak_ptr存在的意义到底是什么呢?...但这个条件本身就很难判断,在我看来可以简单的理解:这个对象在对象或方法内部使用时优先使用unique_ptr。
系列目录 第01篇 主线程与工作线程的分工 第02篇 Reactor模式 第03篇 一个服务器程序的架构介绍 第04篇 如何将socket设置为非阻塞模式 第05篇 如何编写高性能日志 第06篇 关于网络编程的一些实用技巧和细节...当然这里有个技巧性的东西,即增加任务的时候,为了能够立即执行,使用唤醒机制,通过往一个fd里面写入简单的几个字节,来唤醒epoll,使其立刻返回,因为此时没有其它的socke有事件,这样接下来就执行刚才添加的任务了...::bind(writeCompleteCallback_, 23 shared_from_this()));...很多读者可能一直想问,文中不是说解包数据并处理逻辑是业务代码而非网络通信的代码,你这里貌似都混在一起了,其实没有,这里实际的业务代码处理都是框架曾提供的回调函数里面处理的,具体怎么处理,由框架使用者——...socket设置为非阻塞模式 第05篇 如何编写高性能日志 第06篇 关于网络编程的一些实用技巧和细节 第07篇 开源一款即时通讯软件的源码 第08篇 高性能服务器架构设计总结1 第09篇 高性能服务器架构设计总结
领取专属 10元无门槛券
手把手带您无忧上云