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

相关文章

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

全解析CSS Grid 的 auto-fill 和 auto-fit 内容自适应

《全解析CSSGrid的auto-fill和auto-fit内容自适应》:本文主要介绍了全解析CSSGrid的auto-fill和auto-fit内容自适应的相关资料,详细内容请阅读本文,希望能对你有所帮助... css  Grid 的 auto-fill 和 auto-fit/* 父元素 */.gri

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

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 中使