iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++资源管理操作方法详解
  • 778
分享到

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

2024-04-02 19:04:59 778人浏览 薄情痞子
摘要

目录以对象管理资源在资源管理类中小心copy行为在资源管理类中提供对原始资源的访问成对使用new和delete时要采用相同形式以独立语句将new对象置入智能指针以对象管理资源 cla

以对象管理资源

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++资源管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++资源管理操作方法详解

本文链接: https://www.lsjlt.com/news/168347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++资源管理操作方法详解
    目录以对象管理资源在资源管理类中小心copy行为在资源管理类中提供对原始资源的访问成对使用new和delete时要采用相同形式以独立语句将new对象置入智能指针以对象管理资源 cla...
    99+
    2024-04-02
  • Windows资源管理器假死卡住不能操作的解决方法
    很多国产的浏览器都有防假死功能,那么,何谓防假死你有没有碰到Windows系统整个卡住的情况,好比打开一个含电影较多的文件夹时资源管他文件夹窗口也不能操作了。 有没办法让Windows7、Vista的资源管理器也能做到防...
    99+
    2023-06-04
    Windows 资源管理器 假死 解决 方法
  • Java使用wait() notify()方法操作共享资源详解
    Java多个线程共享资源;  1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。  2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即...
    99+
    2023-05-31
    java 共享
  • win7资源管理器老是停止工作解决方法
    方法步骤:在开始菜单中搜索并打开【查看可靠性历史记录】。2、之后在新界面点击红叉部分,会显示出现异常的程序。双击程序名称,显示详细错误信息。3、根据显示程序的名称或路径,将相应软件卸载出故障的程序,重新安装测试是否正常。...
    99+
    2023-06-05
  • C#操作XML方法详解
    目录 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(...
    99+
    2024-04-02
  • 线程管理与操作系统资源分配
    线程管理 线程是操作系统可调度的执行单元。线程管理涉及创建、同步和终止线程。 创建线程:操作系统创建线程,分配内存并设置其执行堆栈。 线程同步:当多个线程访问共享资源时,需要同步以防止冲突。常见的方法包括互斥锁、信号量和条件变量。 终止...
    99+
    2024-04-02
  • windows7资源管理器怎么打开windows7资源管理器怎么打开方法详细介绍
    windows7资源管理器怎么打开是一些必须进到资源管理器的用户遇到的问题,当用户们进到win7后发觉我的电脑变成了资源管理器因而想知道怎么打开资源管理器。如果没有标志因此在这里就告诉大家有关windows7资源管理器怎么打开方法详细介绍的...
    99+
    2023-07-11
  • C#目录和文件管理操作详解
    目录目录和文件管理Environment类例子DriveInfo类Path类目录管理文件管理总结目录和文件管理 在.NET框架中,与操作系统环境相关的类主要有两个: 一个是Envir...
    99+
    2022-11-13
    c# 当前目录文件 c文件管理代码 c# 文件管理
  • Linux中工作管理与系统资源的查看方法
    这篇文章主要介绍“Linux中工作管理与系统资源的查看方法”,在日常操作中,相信很多人在Linux中工作管理与系统资源的查看方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中工作管理与系统资源的查...
    99+
    2023-06-16
  • win7提示资源管理器已停止工作完美解决方法
    从得知微软Windows7要在09年10月22号,全球发布,微软中国今日和众多软硬件合作伙伴共同宣布最新版本的Windows7已经和九成以上的软硬件及网站完全兼容,从网上下载了windows7 7600 16385 RT...
    99+
    2023-05-30
    资源管理器 已停止工作 解决 win7 方法
  • win7资源管理器重启是怎么回事 解决win7资源管理器经常重启方法
    win7资源管理器重启是怎么回事,怎么办下文将为大家介绍win7资源管理器经常重启解决方法,如果你在使用Windows7系统过程中遇到资源管理器经常重启,那么不妨来看看下文的解决方法吧。 一、首先排除电脑病毒的原因 如...
    99+
    2023-06-08
    win7 资源管理器重启 资源管理器 方法
  • k8s资源管理命令与Namespace使用详解
    目录 一、前言 二、k8s概述 三、k8s常用操作管理命令 3.1 kubectl 命令用法 3.2 常用控制台管理命来源地址:https://blog.csdn.net/zhangcongyi420/article/details/128...
    99+
    2023-09-10
    k8s 操作命令使用 k8s 资源管理命令总结 k8s namespace使用 k8s namespace k8s资源命令总结
  • 详解C#操作XML的方法总结
    本文的主要模块为: 1.生成xml文件 2.遍历xml文件的节点信息 3.修改xml文件的节点信息 4.向xml文件添加节点信息 5.删除指定xml文件的节点信息 假设我们需要设计出...
    99+
    2022-11-13
    C#操作XML方法 C#操作XML C# XML
  • C#操作INI文件的方法详解
    目录INI文件介绍kernel32Demo案例实现功能程序代码扩展作用本文主要介绍通过调用kernel32函数,实现对ini文件的读取和写入。 INI文件介绍 INI文件全称是Ini...
    99+
    2022-11-13
    C#操作INI文件 C#操作INI C# INI文件
  • 详解Go语言的错误处理和资源管理
    目录一、defer二、错误处理三、统一错误处理的逻辑四、panic五、recover六、error vs panic七、错误处理综合示例一、defer 1. defer保证在函数结束...
    99+
    2024-04-02
  • win10打开文件资源管理器慢的解决方法
      在我们使用电脑的时候,经常会使用到文件资源管理器来进行操作,但很多小伙伴都遇到了win10打开文件资源管理器慢的问题,让人特别的苦恼,接下来小编就把win10文件资源管理器慢的解决方法带给大家,一起来看看吧。  win10打开文件资源管...
    99+
    2023-07-12
  • Windows资源管理器无限重启的方法
    这篇“Windows资源管理器无限重启的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Windows资源管理器无限重启的...
    99+
    2023-07-02
  • win7资源管理器崩溃的解决方案
    如果遇到win7资源管理器崩溃,可能是由计算机误操作或其他情况引起的,应该采取哪些措施处理?。如果它总是崩溃,它将严重影响我们计算机系统的正常使用。今天,小编将与大家分享如何解决win7资源管理器崩溃的细节。先按win+r键打开操作窗口,输...
    99+
    2023-07-10
  • 解决win7资源管理器崩溃的办法
    win7资源管理器崩溃怎么办?计算机误操作或其他各种情况都可能导致这种情况,如果总是崩溃,将严重影响我们计算机系统的正常使用。今天小编将详细介绍一下如何解决win7资源管理器崩溃的问题。首先按下win+r键打开运行窗口,输入“regedit...
    99+
    2023-07-15
  • win10资源管理器搜索框没反应的解决方法
    小编给大家分享一下win10资源管理器搜索框没反应的解决方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!win10资源管理器搜索框没反应怎么解决对着此电脑右键,打开管理选项。进入到计算机管理窗口,点击左侧的服务和应用程序...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作