scoped_ptr 与 auto_ptr 与 shared_ptr 区别总结

2024-03-17 15:38

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

1.auto_ptr 被复制后,将失去原来所致资源的所有权;
2.scoped_ptr永远不能被复制或被赋值!scoped_ptr 拥有它所指向的资源的所有权,并永远不会放弃这个所有权;
3.shared_ptr 是可以共享所有权的智能指针;


#include "stdafx.h"
//#include "windows.h"
#include <memory>
#include <iostream>
using std::tr1::shared_ptr;
class Foo
{
public:
Foo()
{
std::cout<<"new Foo()"<<std::endl;
i = 0;
}
~Foo()
{
std::cout<<"destroy Foo()"<<std::endl;
}
void print()
{
std::cout<<"Foo::print"<<std::endl;
}
int i;
};

void OutSharePtr(shared_ptr<Foo> &P)
{
Foo* p = new Foo();
shared_ptr<Foo> sp1(p);
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
shared_ptr<Foo> sp2(sp1);
p->print();
sp2->print();
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
P = sp2;
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
}
void InSharePtr(shared_ptr<Foo> &p)
{
p->i += 100;
std::cout<<p.use_count()<<"::"<<p.get()<<std::endl;
}
#include <algorithm>
char upCase(char c)
{
return toupper(c);
}
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<Foo> sp1(new Foo());
shared_ptr<Foo> sp2(sp1);
shared_ptr<Foo> sp3;
sp1->print();
sp2->print();
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
std::cout<<sp3.use_count()<<"::"<<sp3.get()<<std::endl;
sp3.swap(sp1);
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
std::cout<<sp3.use_count()<<"::"<<sp3.get()<<std::endl;
sp3.reset();
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
sp2.reset();
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
sp1.reset();
std::cout<<sp1.use_count()<<"::"<<sp1.get()<<std::endl;
return 0;
}

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



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

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor