第 12 章 动态内存 标签: C++Primer 学习记录 动态内存 ---- 第 12 章 动态内存 12.1 动态内存与智能指针 12.2 动态数组 ---- 12.1 动态内存与智能指针 不同的存储区域对应着不同生存周期的变量。 静态内存——保存局部 static对象、类 static数据成员和定义在任何函数之外的变量,在第一次使用之前分配内存,在程序结束时销毁。 栈内存——定义在函数内的非 static对象,当进入其定义所在的程序块时被创建,在离开块时被销毁。 堆内存——存储动态分配的对象
一、shared_ptr类 头文件:#include<memory> 智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型 如果当做前提条件判断,则是检测其是否为空 shared_ptr<string> p1; //指向stringshared_ptr<list<int>> p2;//指向int的listif(p1 && p1->empty())*p1="h1"; 二、make_shared函数 最安全的分配和使用动态内存的方法就是调用该函数 此函数在内存中动态分配对象并初始化,返回此对象的sh
c/c++语言的一大特色是在于可以动态的进行内存管理,而这也是它的难点所在。程序出现问题,原因经常在动态内存管理这块,比如分配内存后没有及时释放,或者当前线程提前释放了其他线程也会使用的内存。而c++11中新增的智能指针能在一定程度上解决这些问题
这里的动态创建对象,特指在程序中通过new命令创建对象;而撤销,特指通过delete命令来删除对象并释放其内存空间。
栈是一种基于后进先出(Last-In-First-Out,LIFO)原则的抽象数据类型(ADT)。它可以理解为一种特殊的线性数据结构,其中元素按照一定的顺序进行插入和删除操作。 栈的定义包括以下几个要点:
详解: http://data.biancheng.net/view/157.html
Valgrind 最为开发者熟知和广泛使用的工具莫过于 Memcheck,它是检查 c/c++ 程序内存错误的神器,报告结果非常之精准。
📷 目录 前言 链表 概念及结构 链表的实现 增删查改接口 节点结构体创建 链表节点开辟 链表数据打印 链表尾插数据 链表前删数据 链表数据查找 链表pos位置前插数据(较难) 链表pos位置后插数据(简单) 链表pos位置数据删除 链表节点释放 链表与顺序表区别 ---- 在这个特殊的日子里,祝各位程序员1024节日快乐~ 前言 ---- 本章我们将主要讲解: 单链表及其实现 注:如果还不会顺序表,这里附上链接:数据结构-顺序表实现超详解(小白也能看懂的保姆级教程~) 链表 ---- 概念及
参考资料:《C++ Primer中文版 第五版》 我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。
通常定义变量(或对象),编译器在编译时可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候事先为他们分配确定的存储空间。这种内存分配称为静态存储分配; 这种内存分配的方法存在比较严重的缺陷。
主要内容: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内存分配介绍 详细介绍: C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。 void free
这一章介绍了标准库对动态内存的管理方面,其中12.1的几个智能指针是C11引入的非常实用的类。这章对优化C++代码的编写有很大意义,值得好好理解。至此第二部分"C++标准库"就看完了,下一篇是第二部分简单的总结,然后就是第三部分了。
一、unique_ptr类 头文件:#include<memory> 智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型 与shared_ptr的不同之处: shared_ptr所指向的对象可以有多个其他shared_ptr智能指针 而unique_ptr所指向的对象只能有一个unique_ptr指针,也就是自己。当unique_ptr被销毁时,它所指向的对象也被销毁 二、unique_ptr类的初始化 unique_ptr指针需要绑定到一个new返回的指针上,并且不能直接将new的结果用赋值运算
数组是一种数据结构,与栈、队列、树、图……这类数结构不同,数组是实体数据结构,有自己的物理内存描述。栈、队列、树……是抽象数据结构,或者说是一种数据存储思想,没有对应的物理存储方案,需开发者自行设计逻辑存储方案。
分配在静态内存或者栈内存的对象由编译器自动创建和销毁。对于栈对象仅在其定义的程序块运行时才存在,static对象在使用之前分配,在程序结束时销毁。
单链表需要使用的函数指针操作小技巧计算单链表的长度创建单链表单链表插入数据单链表删除数据效率分析
C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:http://www.cnblogs.com/heyonggang/p/3253036.html 1.什么是智能指针? 智能指针是一个行为类似指针但也提供其他功能的类。 智能指针类实现普通指针行为的类的区别在于:智能指针通常接收指向动态分配对象的指针并负责删除该对象。用户分配对象,但由智能指针类删除它,因此智能指针类需要实现复制控制成员来管理指向共享对
第 15 章 面向对象程序设计 标签: C++Primer 学习记录 继承 派生 虚函数 ---- 第 15 章 面向对象程序设计 15.1 OOP:概述 15.2 定义基类和派生类 15.3 虚函数 15.4 抽象基类 15.5 访问控制与继承 15.6 继承中的类作用域 15.7 构造函数与拷贝控制 15.8 容器与继承 15.9 文本查询程序再探 ---- 15.1 OOP:概述 面向对象程序设计的核心思想是数据抽象、继承和动态绑定。 数据抽象,可以将类的接口与实现分离。 继承,定义相似的类型并对
📷 目录 前言 栈 栈的实现 接口展示 栈结构创建 栈的初始化 栈的销毁 入栈 出栈 空栈判断 栈顶数据获取 栈存入数据个数 栈测试 队列 队列的实现 接口展示 队列类型创建 队列初始化 队列销毁 入队 出队 队列头结点数据 队列尾结点数据 队列存入数据个数 判断空队列 队列测试 ---- 前言 ---- 本章主要讲解: 数据结构中的栈和队列的知识以及如何实现 栈 ---- 概念及结构 栈,一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作 进行数据插入和删除操作的一端 称为栈
队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 的原则。
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者C#,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。本期专题将从内存管理、内存泄漏、内存回收这三个方面来探讨C++内存管理问题。
第 13 章 拷贝控制 标签: C++Primer 学习记录 拷贝控制 ---- 第 13 章 拷贝控制 13.1 拷贝、赋值与销毁 13.2 拷贝控制和资源管理 13.3 交换操作 13.4 拷贝控制示例 13.5 动态内存管理类 13.6 对象移动 ---- 13.1 拷贝、赋值与销毁 拷贝控制成员,5个函数,分别是拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符和析构函数。其中,拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同
数据结构是由“数据”和“结构”两词组合而来。 什么是数据?常见的数值1、2、3、4.....、教务系统里保存的用户信息(姓名、性别、年龄、学历等等)、网页里肉眼可以看到的信息(文字、图片、视频等等),这些都是数据什么是结构? 当我们想要使用大量使用同一类型的数据时,通过手动定义大量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在一起,结构也可以理解为组织数据的方式。 概念:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系 的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么方式构成,以及数据元素之间呈现的结构。 总结: 1)能够存储数据(如顺序表、链表等结构) 2)存储的数据能够方便查找 2、为什么需要数据结构?
为了更容易(同时也更安全的)地使用动态内存,新的标准库提供了两种智能指针,来管理动态对象。智能指针的行为类似于常规指针,重要的区别是它负责自动释放所指向的对象。
综上: 栈区(stack) — 由编译器自动分配释放,存放函数的参数值,局部变量的值等其操作方式类似于数据结构中的栈 堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS(操作系统)回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表 全局区(静态区)(static) — 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放 文字常量区 — 常量字符串就是放在这里的。程序结束后由系统释放 程序代码区 — 存放函数体的二进制代码
上一篇博客博主为大家带来了数组的内容分享,本篇博客我们来学习另外一个重要的数据结构——链表!
智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期,实现内存的自我回收。
theme: channing-cyan highlight: a11y-dark
栈顶:通常将表中允许进行插入、删除操作的一端称为栈顶 (Top),因此栈顶的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。
这篇是第二部分的总结,基本上就是回看了之前的5篇笔记并且重新翻翻书梳理了一下,内容基本都是从前面的章节复制来的,长度较长,不熟悉的话看起来可能不会很轻松。
面向对象程序设计object-oriented programming的核心思想是数据抽象、继承和动态绑定:
栈的结构: 使用数组实现栈时,维护一个top指针指向栈顶元素的下一个位置。入栈时将元素添加到数组top位置,并将top加1;出栈时从top位置取元素,并将top减1。 使用链表实现栈时,链表的头结点指向栈顶元素。入栈添加新节点到头结点后面,出栈删除头结点。 所以栈具有后进先出的特性,是一种限定只允许在一端插入和删除的线性数据结构。
回顾之前的顺序表,我们发现就算是动态扩容,我们也都是成倍的括,也可能存在空间浪费,并且顺序表的头插头删还十分麻烦,需要挪动数据。 而链表的存在就解决了头插头删以及空间浪费这一问题,提到链表,我们脑海中就会浮现出一个链条把东西都链接起来。
C++是C的超集,也就是说,C++包括了C的所有基础特性,并且还增加了一些新的特性。下面列举一些C和C++之间的主要区别:
slices[2]包提供了适用于任何类型切片的函数。在这篇博文中,我们将通过理解切片在内存中的表示方式的讨论以及它对垃圾收集器的影响,来更有效地使用这些函数,此外,我们还将介绍最近对这些函数进行的调整,使它们更加符合预期。
delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
Java是纯62616964757a686964616fe58685e5aeb931333433663063面向对象语言,语法简单明了,易于掌握。
1. C语言传统处理错误的方式无非就是返回错误码或者直接是终止运行的程序。例如通过assert来断言,但assert会直接终止程序,用户对于这样的处理方式是难以接受的,比如用户误操作了一下,那app直接就终止退出了吗?这对用户来说,体验效果是很差的,毕竟我只是不小心误操作了而已,程序就直接退出了,那太不合理了!而像返回错误码这样的方式也不够人性化,需要程序员自己去找错误,系统级别的很多接口在出错的时候,总是会把错误码放到全局变量errno里面,程序员还需要通过打印出errno的值,然后对照着错误码表来得出errno对应的错误信息是什么。 而实际中,C语言基本都是使用错误码来处理程序发生错误的情况,部分情况下使用终止程序的方式来处理错误。
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
front和rear都指向-1,表示队列中没有数据。size为0,表示队列中没有元素。
静态顺序表由于容量是有限的,所以在实际应用的时候不如动态顺序表更灵活,动态顺序表在实际应用中更广泛
要编写一个顺序表项目,首先要明确我们想要达到的效果是什么样,下面我将用vs2022编译器来为大家演示一下顺序表运行时的样子:
首先说明一下,由malloc动态申请的内存空间是堆式的内存空间。 而静态的内存的空间是栈式的。有关堆栈的知识请参考其他相关资料。
因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。
目录 线程管理 线程管理特点 线程工作机制 线程控制块 线程属性 线程栈 线程状态 线程优先级 时间片 线程入口函数 无限循环模式 顺序执行或有限次循环模式 线程错误码 线程状态切换 线程操作 创建动态线程 删除 初始化静态线程 脱离 获得当前线程 让出处理器资源 睡眠 控制线程 挂起线程 恢复线程 设置钩子函数 运行代码 ---- 线程管理 RT-Thread是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,也就是允许多个任务同时运行,但是这并不意味着处理器在同一时刻真地执
本文主要介绍vec函数的基本使用及内存分布情况,以及在工作中遇到的一些坑来分享一下。
在日常生活中,我们通常会将一个大的问题拆分细化,拆开成若干个小问题,通过逐个解决小问题,大问题也就解决了。 同样的在RT-Thread多线程操作系统中,开发人员基于这种分而治之的思想,将一个复杂的应用问题抽象成若干个小的、可调度的、可序列化的程序单元。当合理地划分任务并正确地执行时,这种设计能够让系统满足实时系统的性能及时间的要求。
问题定义:有时需要将不同类型的数据组合成一个有机的整体,以便于使用,就类似于sql中的存储一样,随着语言层次的增高封装性是越来越大的。如:
C 里面就有数组。但是,C 数组具有很多缺陷,使用中有很多的陷阱。我们先来看一下其中的几个问题。
领取专属 10元无门槛券
手把手带您无忧上云