auto_ptr scoped_ptr scoped_array shared_ptr weak_ptr

2024-04-26 09:18
文章标签 scoped auto array shared weak ptr

本文主要是介绍auto_ptr scoped_ptr scoped_array shared_ptr weak_ptr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.对std::auto_ptr进行复制,原来的指针会失效
std::auto_ptr<Widget> p;
std::auto_ptr<Widget> wptr(new Widget());
p = wptr; // wptr指向失效
p->print();
wptr->print();  // 错误

2.boost::scoped_ptr不能拷贝
{
boost::scoped_ptr<Widget> wptr(new Widget());
wptr->print();
boost::scoped_ptr<Widget> wptr2 = wptr; // 编译器出错
}

3.boost::scoped_array管理动态数组
std::auto_ptr和boost::scoped_ptr都不能管理动态分配的数组
{
// 这里调用构造三次,析构三次
boost::scoped_array<Widget> wptr(new Widget[3]);
}

4.boost::shared_ptr真正的智能指针,可以拷贝,作为STL容器成员
在容器销毁后,会自动销毁vector中所有智能指针所指向的对象
{
typedef boost::shared_ptr<Widget> WidgetPtr;
WidgetPtr p1(new Widget());
WidgetPtr p2(new Widget());
std::vector<WidgetPtr> vp;
vp.push_back(p1);
vp.push_back(p2);
}

5.boost::shared_array管理动态数组
{
boost::shared_array<Widget> arrayPtr(new Widget[3]);
arrayPtr[0].print();
}

6.boost::weak_ptr是一个特殊的指针(不增加也不减少引用计数),它是boost::shared_ptr的一个辅助类
{
boost::shared_ptr<Widget> ptr1(new Widget());
boost::shared_ptr<Widget> ptr2 = ptr1;
boost::weak_ptr<Widget> ptr3(ptr2);
std::cout << ptr3.use_count() << std::endl; // 得出智能指针的引用计数
boost::shared_ptr<Widget> ptr4 = ptr3.lock(); // 返回一个智能指针
std::cout << ptr3.use_count() << std::endl;
}

7.使用boost::shared_ptr的时候尤其要注意循环引用的问题,boost::weak_ptr可以解决。
class Widget
{
public:
Widget() { std::cout << "Widget" << std::endl; }
~Widget() { std::cout << "~Widget" << std::endl; }
void print() { std::cout << "Print" << std::endl; }
boost::shared_ptr<Widget> ptr_; // 改为boost::weak_ptr<Widget> ptr_;
};

// 这里存在循环引用问题,所以资源是释放不掉的,应该将Widget中的boost::shared_ptr改为boost::weak_ptr
{
boost::shared_ptr<Widget> ptr(new Widget());
ptr->ptr_ = ptr;
}

7.如果是owner类持有child类,child类也持有owner类造成的循环引用,通常解决方法是:owner持有指向的child的shared_ptr,child持有指向owner的weak_ptr。


这篇关于auto_ptr scoped_ptr scoped_array shared_ptr weak_ptr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937183

相关文章

error while loading shared libraries: libnuma.so.1: cannot open shared object file:

腾讯云CentOS,安装Mysql时: 1.yum remove libnuma.so.1 2.yum install numactl.x86_64

【uva】11536-Smallest Sub-Array(区间移动问题)

一个区间移动的问题,1A了,感觉没什么好说的。。 13975926 11536 Smallest Sub-Array Accepted C++ 0.809 2014-08-01 11:00:20 #include<cstdio>#include<cstring>#include<iostream>using namespace std;#define INF 1 << 30

leetCode#448. Find All Numbers Disappeared in an Array

Description Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements of [1, n] inclusive that do not appear in this

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

做一个问卷考试,标准答案对比用户填写的答案,array_diff 进行差集比对

if( empty(array_diff($answer_mark, $answer)) && empty(array_diff( $answer,$answer_mark))){//用户答题正确}else{// 答题错误} 做一个问卷考试,标准答案对比用户填写的答案,array_diff  进行差集比对   如用户填写的答案变量为answer   标准答案为answer_mark

#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version

昨天编译文件时出现了Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~的错误。   在网上很容易找到了解决的方案,公布如下:   对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享 DLL 中使

Windows用户取消共享文件夹密码方法(Method for Windows Users to Cancel Shared Folder Password)

Windows用户取消访问共享文件夹密码方法 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老 导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监

[LeetCode] 238. Product of Array Except Self

题:https://leetcode.com/problems/product-of-array-except-self/description/ 题目 Given an array nums of n integers where n > 1, return an array output such that output[i] is equal to the product of all

[LeetCode] 215. Kth Largest Element in an Array

题:https://leetcode.com/problems/kth-largest-element-in-an-array/description/ 题目 Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not th

pointer-events: auto; 是一个 CSS 属性,

pointer-events: auto; 是一个 CSS 属性,用于控制一个元素是否可以成为鼠标事件(如点击、悬停、拖动等)的目标。以下是对 pointer-events 属性及其值的详细解释: pointer-events 属性 定义: pointer-events 属性控制如何处理鼠标事件。它可以用于控制元素是否响应鼠标事件以及如何处理事件。 pointer-events: auto;