weak_ptr的主要使用场景,一是用于探查是否内存空间是否有效,用户可以通过expired()或者lock()来检测数据的有效性,以避免空指针。二是可以用于打破循环引用。c++20中的原子智能指针 智能指针的计数器是线程安全,但是其指向的对象的不是线程安全的。如果需要多个线程操作,为了保证安全性,可以 1、直接调用 mutex 的 ...
因为C++使用内存的时候很容易出现野指针、悬空指针、内存泄露的问题。所以C++11引入了智能指针来管理内存。有四种: auto_ptr:已经不用了 unique_ptr:独占式指针,同一时刻只能有一个指针指向同一个对象 shared_ptr:共享式指针,同一时刻可以有多个指针指向同一个对象 weak_ptr:用来解决shared_ptr相互引用导致的死锁问题...
需要引入线程“同步”机制,即各位线程之间有序地对共享资源进行操作。 #include<pthread.h>usingnamespacestd;queue<int>q;void*pop(void*args){//线程未同步导致的多线程安全问题// 会有重复的数据取出并出现异常if(!q.empty()){printf("取出数据:%d\n",q.front());q.pop();}else{printf("无数据\n"...
简单地说,智能指针只是用对象去管理一个资源指针,同时用一个计数器计算当前指针引用对象的个数,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器为1,此时在销毁指针管理对象的同时,也把指针管理对象所管理的指针进行delete操作。 1、auto_ptr指针 C++11之前的智能指针是aut...
错误#2:没有保证shared_ptr共享的资源/对象的线程安全性! Shared_ptr可以让你通过多个指针来共享资源,这些指针自然可以用于多线程。有些人想当然地认为用一个shared_ptr来指向一个对象就一定是线程安全的,这是错误的。你仍然有责任使用一些同步原语来保证被shared_ptr管理的共享对象是线程安全的。
线程安全 shared_ptr智能指针的引用技术使用了院子操作,只要共享指针再拷贝或者赋值减少引用,实现对应的线程安全 有一个引用计数的指针类型变量,专门用于引用计数,使用拷贝构造函数和赋值拷贝构造函数时,引用计数加1,当引用计数为0时,释放资源。 weak_ptr weak_ptr是弱引用,weak_ptr的构造和析构不会引起引用计数的增加...
shared_ptr的可以让你分享这基本上可以从多个线程使用的资源彻底多个指针。这是一个常见的错误假设,在一个shared_ptr的包装对象多达使得它固有线程安全的。它仍然是你的责任,把周围由一个shared_ptr管理的共享资源同步原语。 建议- 如果你不共享多个线程之间的资源规划,使用的unique_ptr。
智能指针的核心功能是自动管理其指向的对象的生命周期。使用堆分配的引用计数允许智能指针独立于任何函数或作用域,随时正确地管理对象的生命周期。如果使用栈分配的引用计数,那么计数的有效性将受限于它所在作用域的生命周期,这将导致无法跨作用域或线程安全地共享和管理智能指针。 3. 支持弱引用 std::shared_ptr 还与...
首先感慨一句,muduo库对C语言原生的线程安全以及同步的API的封装,真的称得上是教科书式的,非常精妙、规范,很值得学习。 读者在阅读muduo源码的时候,看到类定义的类名称被一些宏定义修饰、以及类的成员变量被一些宏定义修饰时,可以直接忽略,无视这些宏。因为这些东西的存在完全不影响整体的功能。简单来说就是吓唬人的...
增加了std::atomic:让智能指针线程安全 source_location:可作为__LINE__ 、__func__这些宏的替代: #include <iostream>#include <string_view>#include void log(const std::string_view message, const std::source_location& location = std::source_location::current()){ std::cout << 'info: ' <<...