动态内存

静态内存和堆栈

╄→гoц情女王★ 提交于 2020-03-28 05:40:25
一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 代码区:存放函数体的二进制代码 文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 函数指针指向Code区,是程序运行的指令代码,数据指针指向Data,Heap,Stack区,是程序依赖以运行的各种数据 在文件作用域声明inline函数默认为static存储类型,const常量默认为static存储,如果加上extern,则为外部存储类型。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方

静态内存、动态内存与堆栈

五迷三道 提交于 2020-03-28 05:40:04
一、何谓静态内存、动态内存 静态内存分配好后,程序运行过程中一直存在不会被释放,且一旦分配好,其内存大小就固定下来不能改变,在编译和链接的阶段就会分配好。 动态内存是程序运行过程中,根据程序的需要分配和释放,其大小可变。 二、堆与栈 堆和栈都是动态分配的,区别有两点: 1、栈是由编译器分配与释放,堆是程序通过调用malloc或new分配,调用free或delete释放。 2、栈是线性结构,堆是链表结构。 三、使用场景 1、全局变量和static修饰的静态变量都存放在静态内存区。 2、函数内部定义的局部变量,存储在栈上,函数退出时,其占用内存被收回。 3、通过调用malloc或new得到的内存在堆上,不再需要时要显示的调用free或delete来释放,否则会造成内存泄漏,虽然有些操作系统会在程序退出后自动回收这部分内存,但还是要记住申请内存与释放内存成对操作,养成好习惯。 下面一段代码列举静态内存和动态内存的各种情形: //main.cpp int a = 0; //全局初始化区 ,静态内存 char *p1; //全局未初始化区 ,静态内存 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; // 栈 char *p3 = "123456"; //"123456\0"在常量区,静态内存,p3在栈上。 static int c =0

C-C++一些细节

与世无争的帅哥 提交于 2020-03-22 00:32:46
C++内存解析 一、内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 二、三者之间的区别我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。 例一:静态存储区与栈区 char* p = “Hello World1”; char a[] = “Hello World2”; p[2] = ‘A’; a[2] = ‘A’; char* p1 = “Hello World1”; 这个程序是有错误的,错误发生在p[2] = ‘A’这行代码处,为什么呢? 是变量p和变量数组a都存在于栈区的

Linux内存分配机制

不羁岁月 提交于 2020-03-07 14:07:34
原文:https://blog.csdn.net/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析: 一、Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) ) 2、数据段:保存全局变量、静态变量的空间; 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 6、内核虚拟空间

智能指针

岁酱吖の 提交于 2020-03-05 07:27:53
title: 智能指针 date: 2018-04-02 15:21:32 categories: C/C++ tags: 指针 为什么使用动态指针? 在C++中,动态内存的管理是通过一对运算符来完成的: new: 在动态内存中为对象分配空间并返回一个指向该对象的指针,同时可以对这个对象初始化。 delete: 接受一个动态对象的指针,销毁该对象并释放与之关联的内存。 这样动态内存的使用就很容易出现问题: 忘记释放内存(delete)就会产生内存泄漏的问题。 过早释放内存(在还有指针引用该内存的时候就释放了它)就会产生引用非法内存的指针。 为了防止出现这种情况,更容易更安全地使用动态内存, 自C++11开始提供了两种智能指针类型来管理动态对象。 什么是智能指针? 智能指针是存储指向动态分配(堆)对象指针的类。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。 智能指针的原理是什么? 资源分配即初始化RAII(Resource Acquisition Is Initialization):RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。 定义一个类来封装资源的分配和释放,在构造函数完成资源的分配 和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。

C++内存管理转自http://soft.yesky.com/lesson/110/2381610.shtml

拈花ヽ惹草 提交于 2020-02-23 15:04:50
转自 http://soft.yesky.com/lesson/110/2381610.shtml 踏入C++中的雷区——C++内存管理详解 2006-04-25 09:22 作者:蒋涛 出处:计算机教学网 责任编辑:方舟   伟大的Bill Gates 曾经失言:   640K ought to be enough for everybody — Bill Gates 1981   程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。    1、内存分配方式   内存分配方式有三种:   (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。    2

C++ 面向对象高级开发 -- string

﹥>﹥吖頭↗ 提交于 2020-02-14 01:29:42
1. Object Based(基于对象) vs. Object Oriented(面向对象) Object Based: 面对的是单一class的设计; Object Oriented:面对的是多重classes的设计,class 和 class 之间的关系。 classes 的两个经典分类: class without pointer members -- complex class with pointer members -- string 2. 设计 string   2.1 防卫式声明   2.2 Big Three 若类内有指针成员,则一定要重写 拷贝构造函数,赋值构造函数和析构函数,即Big Three,执行 深拷贝 操作。编译器默认生成的 拷贝构造函数和赋值构造函数 只会进行 浅拷贝 ! 由于未能确定string对象的大小,因此类内提供一个指针成员,指向动态内存。   2.3 ctor 和 dtor 注意!在析构函数中,调用 delete [] m_data; 释放内存。 在右下角的函数应用中,一旦离开作用域 {} , s1 和 s2 自动调用析构函数释放内存。由于 p 是动态分配的内存,其生命周期在整个程序运行周期内。p 要到程序结束运行后,由系统自动回收泄露的内存。   2.4 copy ctor 和 copy op= 拷贝构造函数 拷贝赋值函数 分3个步骤:

常见的动态内存分配错误

六月ゝ 毕业季﹏ 提交于 2020-02-07 03:53:23
在使用动态分配的内存时,常出现的错误为:对null指针进行解引用操作(*),对分配的内存进行操作时越过边界,释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后被继续使用。 传递给free的指针必须是从malloc、calloc、realloc函数返回的指针,传给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。试图释放一块动态分配的内存的一部分也可能引起类似问题。例如 pi = malloc(10 * sizeof(int)); free(pi + 5);//释放后五个 这样企图释放内存的一部分是不容许的,必须整块一起释放。但realloc函数可以缩小一块动态分配的内存,有效释放它尾部的部分内存。 注意不要访问已经被free释放掉的内存,如果对指向动态分配的内存指针进行了复制,而且这个指针的几份copy散布于程序各处,则无法保证当年使用其中一个指针时它指向的内存是不是已被另一个指针释放(野指针,应将这些指针全部指向NULL)。另外必须保证程序中所有使用这块内存的地方在这块内存被释放之前停止对它的使用。 ------------------------ 动态分配内存最常见的错误是忘记检测所请求的内存是否分配成功。可以用一下方式进行改进: #include<stdlib.h> #define malloc /

C和C++ 语言动态内存分配

随声附和 提交于 2020-02-02 00:12:35
一、C语言动态内存分配 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”) 1.malloc函数   函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。 2.calloc 函数 函数原型为void *calloc(unsigned int num, unsigned int size)   按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof

小熊派华为物联网操作系统LiteOS内核教程06-内存管理

泄露秘密 提交于 2020-01-19 00:38:13
1. LiteOS内核的内存管理 1.1. 内存管理 在系统运行的过程中,一些内存空间 大小是不确定的 ,比如一些数据缓冲区,所以系统需要提供内存空间的管理能力,用户可以在使用的时候申请需要的内存空间,使用完毕释放该空间,以便再次利用。 Huawei LiteOS 的内存管理模块通过对内存的申请/释放操作,来管理用户和OS对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。 1.2. 动态内存管理 动态内存管理,即在内存资源充足的情况下,从系统配置的一块比较大的连续内存(内存池),根据用户需求,分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。 与静态内存相比,动态内存管理的好处是按需分配,缺点是内存池中容易出现碎片 。 LiteOS动态内存支持 DLINK 和 BEST LITTLE 两种标准算法。 1.2.1. DLINK 动态内存管理算法 DLINK动态内存管理结构如下图所示: 第一部分 堆内存(也称内存池)的起始地址及堆区域总大小。 第二部分 本身是一个数组,每个元素是一个双向链表,所有free节点的控制头都会被分类挂在这个数组的双向链表中。 第三部分 占用内存池极大部分的空间,是 用于存放各节点的实际区域 。 1.2.2. BEST LITTLE 算法(重点) LiteOS 的动态内存分配支持最佳适配算法,即