首页 > 其他分享 >shared_ptr, unique_ptr,weak_ptr

shared_ptr, unique_ptr,weak_ptr

时间:2024-03-02 16:47:48浏览次数:21  
标签:std DoSomething weak shared unique ptr

#include <iostream>
#include <memory>

class MyClass {
public:
 MyClass() {
 std::cout << "MyClass constructed" << std::endl;
 }

 ~MyClass() {
 std::cout << "MyClass destructed" << std::endl;
 }

 void DoSomething() {
 std::cout << "Doing something" << std::endl;
 }
};

int main() {
 // 使用 shared_ptr
 std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
 ptr1->DoSomething();

 // 使用 unique_ptr
 std::unique_ptr<MyClass> ptr2 = std::make_unique<MyClass>();
 ptr2->DoSomething();

 // 使用 weak_ptr
 std::weak_ptr<MyClass> ptr3 = ptr1;
 if (std::shared_ptr<MyClass> ptr4 = ptr3.lock()) {
 ptr4->DoSomething();
 }

 return 0;
}
在这个示例中,我们创建了一个名为MyClass的类,它有一个构造函数和一个析构函数,以及一个DoSomething方法。然后,在main函数中,我们使用std::make_shared<MyClass>创建了一个shared_ptr,并调用了它的DoSomething方法。接下来,我们使用std::make_unique<MyClass>创建了一个unique_ptr,并调用了它的DoSomething方法。最后,我们使用ptr1创建了一个weak_ptr,并通过lock方法获取了一个shared_ptr,然后调用了它的DoSomething方法。

 

下面是对这三种智能指针的区别的解释:

 

1.shared_ptrshared_ptr使用引用计数来管理动态分配的对象的内存。当引用计数为 0 时,对象将被自动删除。多个shared_ptr可以共享同一个对象的所有权,因此可以安全地在多个线程之间共享对象。

 

2.unique_ptrunique_ptr拥有对象的所有权,并且不允许共享所有权。当unique_ptr超出范围时,对象将被自动删除。unique_ptr适用于单个所有者的情况,例如在单线程环境中。

 

3.weak_ptrweak_ptr是一种引用计数智能指针,它不会增加对象的引用计数。weak_ptr可以用来监视对象的存在,但不能直接操作对象。当对象被删除时,weak_ptr将变为空指针。weak_ptr通常与shared_ptr一起使用,以实现安全的循环引用。

 

标签:std,DoSomething,weak,shared,unique,ptr
From: https://www.cnblogs.com/music-liang/p/18048787

相关文章

  • UUID(Universally Unique Identifier,通用唯一识别码)起源 发展阶段 作用 功能 价值 组
    UUID(UniversallyUniqueIdentifier,通用唯一识别码)UUID(通用唯一识别码)的起源可以追溯到计算机科学领域。它最初由开放软件基金会(OpenSoftwareFoundation,OSF)制定,并在分布式计算环境中广泛使用。UUID的目的是确保在分布式系统中生成唯一的标识符,以避免不同节点或应用程序生成相......
  • python | Pandas.unique()函数
    unique()是Pandas中的一个函数,用于获取Series或DataFrame中的唯一值,它返回一个包含Series或DataFrame中唯一值的数组,按照它们在原始数据中的出现顺序排列。对于足够长的序列,比numpy.unique快得多。包括NA值。data={'Name':['John','Tom','Alice','John'],'Ag......
  • SpringBoot应用“No primary or single unique constructor found for interface java
    Bug复现今天在写SpringBoot应用时,写一个后端生成图形验证码的业务时,需要用到session保存后端生成的图形验证码的Base64编码,然后前端通过session来显示图形验证码。代码里用到了servlet里的HttpSession类,于是idea自动导入了javax.servlet包里的HttpSession。业务代码如下:packag......
  • SciTech-Mathmatics-UNIQUE FACTORIZATION THEOREM
    SciTech-Mathmatics-UNIQUEFACTORIZATIONTHEOREMElementary_Number_Theory:https://math.libretexts.org/Bookshelves/Combinatorics_and_Discrete_Mathematics/Elementary_Number_Theory_(Clark)/01%3A_Chapters/1.11%3A_Unique_Factorizationhttps://public.csusm.edu/......
  • ChessFunctions+ActiveXControl+SharedAddIn三合一【Office和VBA中呈现中国象棋】
    本软件由三个项目构成,各自下载链接如下:ChessFunctions链接:https://pan.baidu.com/s/11pMnmd28nHtpTGCU9rwNHg提取码:1234ChessFunctions的帮助文件链接:https://pan.baidu.com/s/1uxJYx8gOd8sNEBlda3onnA提取码:1234ActiveXControl链接:https://pan.baidu.com/s/1CTLcXlQgZaD1_av......
  • error while loading shared libraries解決办法
    报错errorwhileloadingsharedlibraries:xxx.so.0:cannotopensharedobjectfile:Nosuchfileordirectory……找不到库文件排查解决首先,查找文件是否存在。然后,在/etc/ld.so.conf.d/目录下新建一文件,名字自行决定websockets.conf。添加库文件到以下目录中:/usr/......
  • mysql: error while loading shared libraries: libncurses.so.6: cannot open shared
    查找没有libncurses.so.5,可能有libncurses.so不同版本的文件,使用命令find/-name'libncurses*'复制+覆盖软链接先复制到lib64文件夹,再用软链接重新覆盖一下[root@lab-aliyunwzx]#cp/home/wll/miniconda3/lib/libncurses.so.6/lib64[root@lab-aliyunwzx]#cd/lib6......
  • 搭建RAC时报错Cannot verify the shared state for device /dev/asm-diskd due to Uni
    问题描述:搭建RAC时报错Cannotverifythesharedstatefordevice/dev/asm-diskdduetoUniversallyUniqueIdentifiers(UUIDs)notbeingfound......,如下所示:系统:rhel7.964位数据库:19c1、异常重现详细告警日志:ASMdevicesharednesscheck-Thischeckverifiesthe......
  • shared_ptr 循环引用以及解决办法
    问题代码#include<memory>#include<stdio.h>usingnamespacestd;classA;classB{public:B(){printf("B()\n");}~B(){printf("~B()\n");} voidprint(){printf("B\n");}shared_ptr<A>ptr......
  • 两个Mysql唯一索引的交换: 避免重复索引 Duplicate entry '3' for key 'priority_UNIQ
    需求我做了一个排行榜,但是主键是pid,不是排名,排名作为唯一索引,两个人排名交换,只需要交换排名唯一索引值即可.但是直接单独更新提示错误:Duplicateentry'3'forkey'priority_UNIQUE'方法本来希望可以在一条SQL语句中交换两个唯一索引值,但是发现这是不可能的,因为值......