热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TCPLC++资源管理简述

TheCProgrammingLanguage第五章5.2总结资源管理对于大型程序来说非常重要。内存泄漏轻则导致性能下降,严重则会引起程序崩溃等问题。C的机制主

The C++ Programming Language

第五章5.2总结

资源管理对于大型程序来说非常重要。内存泄漏轻则导致性能下降,严重则会引起程序崩溃等问题。

C++的机制主要是constructor/destructor;

下面是一个标准库lock类的用法:

mutex m; // used to protect access to shared data
// ...
void f()
{
unique_lock lck {m}; // acquire the mutex m
// ... manipulate shared data ...
}

相当于一个系统原理里面的互斥访问的机制。这里lck需要取得mutex类的m才能进行下面的运算,然后当f()函数介绍的时候,会自动释放mutex。相当于让出访问权给其他可能需要访问的程序。

#include中有两个“smart pointers”,之所以叫聪明是因为他们有自动管理资源的功能。
[1] unique_ptr 只能有一个拥有者
[2] shared_ptr 可以共享多个拥有者,用counter计数的方法,计算有多少个用户或程序共享改指针。

例如:

void f(int i, int j) // X* vs. unique_ptr;X代表一种类型,如int,double
{
X∗ p = new X; // allocate a new X
unique_ptr sp {new X}; // 创建一个unique_ptr
if (i<99) throw Z{}; // may throw an exception,如果执行该句的话&#xff0c;那么就无法正常释放p指针了
if (j<77) return; // may retur n "early"&#xff0c;同样道理&#xff0c;无妨执行下面的语句&#xff1a;delete p
p−>do_something(); // may throw an exception
sp−>do_something(); // may throw an exception
// ...
delete p; // destroy *p
}

这里使用unique_ptr sp{new X}的话可以保证&#xff0c;内存正常释放。

根据C&#43;&#43;之父Bejarne的建议是尽量不要用或少用new&#xff0c;delete。

而unique_ptr是个轻量级的机制&#xff0c;相对普通指针&#xff0c;它消耗的空间和时间都差不多。

unique_ptr make_X(int i)
// make an X and immediately give it to a unique_ptr
{
// ... check i, etc. ...
return unique_ptr{new X{i}};
}

shared_ptr和unique_ptr差不多&#xff0c;不过&#xff0c;shared_ptr赋值的时候是copied复制过去&#xff0c;而不是moved移动了。
The shared_ptr is similar to unique_ptr except that shared_ptrs are copied rather than moved.
一个对象的shared_ptr指针的所有权可以共享的&#xff0c;只有最后一个共享者退出的时候&#xff0c;才会destroyed。

它保留一个counting的机制&#xff0c;记录有多少共享者。

什么时候应该用这些指针呢&#xff1f;
1 当我们共享一个对象的时候&#xff0c;我们需要指针去指向这些共享对象使用shared_ptr.

2. 当我们引用多态对象时&#xff0c;我们需要指针或者引用去访问对象。

3. 共享多态对象一般都需要shared_ptr



推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
author-avatar
我我檬檬我我186
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有