我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++资源管理操作方法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++资源管理操作方法详解

以对象管理资源

class A{...};
//工厂函数createA来提供特定的A对象
A* createA();
//坏情况
void f(){
    A* p=createA();
    ...
    delete p;//如何在delete之前程序先return了,则无法delete
}
//为了确保资源释放 将资源放进对象内 利用对象的析构函数来释放
void f(){
    std::shared_ptr<A> p(createA());
    ...
    //程序结束后会经shared_ptr的析构函数释放
}

auto_ptr已经被废除,主要原因是其拷贝会造成所以权转移,所以使用shared_ptr更好

以对象管理资源的关键想法:

1、获得资源后立刻放进管理对象内

2、管理对象运用析构函数释放资源

注意是:shared_ptr和auto_ptr两者都在析构函数上使用delete而不是delete[],所以在动态分配的数组上使用它们不好。当然我觉得还是少用动态数组,用vector,string啥的就能代替咯。

在资源管理类中小心copy行为

复制RAII对象时有两种选择:

1、禁止复制--------将copying操作声明为private

class Lock:private Uncopyable{
public:
    ....
};

2、对底层资源祭出"引用计数法"--------即shared_ptr

class Lock{
public:
    explicit Lock(Mutex* pm):mutexPtr(pm,unlock)//unlock函数为删除器
    {
        lock(mutexPtr.get());
    }
private:
    shared_ptr<Mutex>mutexPtr;
}

复制底部资源:需要资源管理类对象的唯一理由是不需要某个复件资源时确保被释放,在此情况下复制资源管理类对象,应该也复制其所包括的资源,即深拷贝------当一个对象被复制时,不论指针或其所指内存都会被制作出一个复件,即深拷贝。

转移底部资源所有权:auto_ptr,你只希望有一个RAII对象指向一个未加工资源,即使被复制也是如此。

在资源管理类中提供对原始资源的访问

前提:智能指针其实是一个类

shared_ptr<A>p(createA());
//假如有以下函数
int func(const A* pi);
//如下调用错误 因为p是一个智能指针不是一个指向A的指针
int f=func(p);
//调用get函数返回原始资源
int f=func(p.get());

智能指针重载了指针取值操作符(->,*) 允许隐式转换到原始指针

//例如A有一个函数,p是一个指向A的智能指针
int A::getNum();
//如下调用合格,其实是发生了一个智能指针到原始指针的隐式转换
int num=p->getNum();

一般而言显示转换比较安全,隐式转换客户使用方便。

成对使用new和delete时要采用相同形式

delete的最大问题在于:即将被删除的内存之内究竟有多少个对象

即:被删除的那个指针是指的单一对象还是成对数组?

string* p1=new string;
string* p2=new string[100];
delete p1;
delete[] p2;

规则很简单:new中用了[],delete就要用[]

以独立语句将new对象置入智能指针

假设有一个函数来揭示处理程序的优先权,另一个函数用来在动态分配所得的Widget上进行某些带有优先权的处理

int priority();
void processWidget(shared_ptr<Widget>pw,int priority);
//错误
processWideget(new Widget,priority());
//因为shared_ptr的构造函数需要一个原始指针,该构造函数是explicit,无法隐式转换
processWideget(shared_ptr<Widget>(new Widget),priority());//可以

但是编译器执行顺序不确定,调用该函数前,编译器需要:

调用priority,执行new Widget,shared_ptr构造函数

但调用priority的顺序可以是第一第二或第三(new 和智能指针的先后顺序不能变)

如何是先new,后priority,再shared_ptr,万一priority调用失常,则new出来的指针遗失,尚未置入shaerd_ptr的构造函数,则会资源泄漏。

因此分开写最好:

shared_ptr<Widget>pw(new Wideget);
processWidget(pw,priority());

到此这篇关于C++资源管理操作方法详解的文章就介绍到这了,更多相关C++资源管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++资源管理操作方法详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java使用wait() notify()方法操作共享资源详解

Java多个线程共享资源;  1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。  2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即
2023-05-31

Windows资源管理器假死卡住不能操作的解决方法

很多国产的浏览器都有防假死功能,那么,何谓防假死?你有没有碰到Windows系统整个卡住的情况,好比打开一个含电影较多的文件夹时资源管编程理器卡住了,其GOMQBYs他文件夹窗口也不能操作了。 有没办法让Windows7、Vista的资源管
2023-06-04

win8资源管理器的必备操作技巧图文详解

Win8的资源管理器界面采用类似Office2010的Ribbon界面风格,从对于文件的简便与直观操作来说,比Win7要优越的多。所以想要熟练掌握Win8的资源管理器,就必须熟悉Ribbon界面的必备操作技巧。小贴士:“文件夹与
2022-06-04

win7资源管理器老是停止工作解决方法

方法步骤:1、在开始菜单中搜索并打开【查看可靠性历史记录】。2、之后在新界面点击红叉部分,会显示出现异常的程序。双击程序名称,显示详细错误信息。3、根据显示程序的名称或路径,将相应软件卸载出故障的程序,重新安装测试是否正常。
2023-06-05

C#目录和文件管理操作详解

在C#中常用的目录操作类有Directory,DirectoryInfo,下面这篇文章主要给大家介绍了关于C#目录和文件管理操作的相关资料,需要的朋友可以参考下
2022-11-13

MySQL8.0功能详解——资源组管理

MySQL8.0里包括一款功能——CPU资源分组管理。它实现的目的是将CPU资源分组,并且赋予运行不同类型的查询。通过它可以解决DBA的一些痛点,例如:夜间进行的批处理、大型报表非常耗费资源,为了不影响其它查询的进行,不得不将其放在从服务器上运行。使用资源组管
MySQL8.0功能详解——资源组管理
2020-01-07

windows7资源管理器怎么打开windows7资源管理器怎么打开方法详细介绍

windows7资源管理器怎么打开是一些必须进到资源管理器的用户遇到的问题,当用户们进到win7后发觉我的电脑变成了资源管理器因而想知道怎么打开资源管理器。如果没有标志因此在这里就告诉大家有关windows7资源管理器怎么打开方法详细介绍的
2023-07-11

详解C#操作XML的方法总结

这篇文章主要为大家详细介绍了C#对XML文件进行一些基本操作的方法,譬如:生成xml文件、修改xml文件的节点信息等,需要的可以参考一下
2022-11-13

Win8资源管理器在哪 多种方法打开Win8资源管理器

最近有网友网友问小编,Win8资源管理器在哪?我怎么找不到进入入口。针对这个问题,小编简单做个解答。资源管理器其实在系统中用的较少,其界面就是和进入“计算机”内部是一样的,没啥特别的功能!由于Win8系统在一些方面有
2022-06-04

C#操作INI文件的方法详解

INI文件全称是InitializationFile的缩写,即初始化文件,是windows系统的系统配置文件所采用的存储格式,统管windows的各项配置。本文介绍了C#操作INI文件的方法,需要的可以参考一下
2022-11-13

win7提示资源管理器已停止工作完美解决方法

从得知微软Windows7要在09年10android月22号,全球发布,微软中国今日和众多软硬件合作伙伴php共同宣布最新版本的Windows7已经和九成以上的软硬件及网站完全兼容,从网上下载了windows7 7600 16385 RT
2023-05-30

Linux中工作管理与系统资源的查看方法

这篇文章主要介绍“Linux中工作管理与系统资源的查看方法”,在日常操作中,相信很多人在Linux中工作管理与系统资源的查看方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中工作管理与系统资源的查
2023-06-16

win7资源管理器重启是怎么回事 解决win7资源管理器经常重启方法

win7资源管理器重启是怎么回事,怎么办?下文将为大家介绍win7资源管理器经常重启解决方法,如果你在使用Windows7系统过程中遇到资源管理器经常重启,那么不妨来看看下文的解决方法吧。一、首先排除电脑病毒的原因 如果电脑中病毒木马等容易
2023-06-08

mysql事务管理操作详解

本文实例讲述了mysql事务管理操作。分享给大家供大家参考,具体如下: 本文内容:什么是事务管理事务管理操作回滚点默认的事务管理首发日期:2018-04-18什么是事务管理:可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完
2022-05-23

win10打开文件资源管理器慢的解决方法

  在我们使用电脑的时候,经常会使用到文件资源管理器来进行操作,但很多小伙伴都遇到了win10打开文件资源管理器慢的问题,让人特别的苦恼,接下来小编就把win10文件资源管理器慢的解决方法带给大家,一起来看看吧。  win10打开文件资源管
2023-07-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录