动态内存

动态内存分配

こ雲淡風輕ζ 提交于 2020-01-10 15:25:06
动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的 需求:程序运行的过程中,可能需要使用一些额外的内存空间 malloc和free用于执行动态内存分配和释放 malloc所分配的是一块连续的内存 malloc以字节为单位,并且不带任何的类型信息 free用于将动态内存归还系统 1 void*malloc(size_t size); 2 void free(void*pointer); 注意: malloc和free是库函数 malloc实际分配的内存可能会比请求的多 不能依赖与不同平台的malloc行为 当请求的动态内存无法满足时,malloc返回NULL 当free的参数为NULL,函数直接返回 malloc的同胞兄弟 1 void*calloc(size_t num,size_t size); 2 void*realloc(void*pointer,size_t,nem_size); calloc的参数返回内存的类型信息,calloc会将返回的内存初始化为0 realloc用于修改一个原先已经分配的内存大小,当使用realloc之后应该使用其返回值,当pointer的第一个参数为NULL时,等价于malloc 来源: https://www.cnblogs

C++智能指针

无人久伴 提交于 2020-01-06 23:00:07
智能指针的由来: 除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。 在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针。 为了更加容易(更加安全)的使用动态内存,引入了智能指针的概念。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。标准库提供的两种智能指针的区别在于管理底层指针的方法不同,shared_ptr允许多个指针指向同一个对象,unique_ptr则“独占”所指向的对象。标准库还定义了一种名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头文件中。 shared_ptr 共享所有权,允许多个指针指向同一个对象,其内部有一个关联的引用计数,用来记录有多少个其他的shared_ptr指向相同的对象,当引用计数为0时将调用析构函数释放对应空间。 make

C++

北慕城南 提交于 2020-01-03 17:33:10
Visual Studio C++基础 C++的include<iostream>包含的是 流对象 而C语言的include<stdio.h>包含的是 函数头文件 std::cout<<"Hello World"<<std::endl; 是C++的命名空间 就是说cout和endl都是定义在std这个命名空间当中的。 使用命名空间,程序员就会避免由于无意定义了和库中相同的名字而导致的名字冲突 C++标准库定义了4个IO对象 动态内存管理 C语言使用malloc()和calloc()进行动态内存分配,free()进行动态内存的释放,必须手工计算具体要分配多大的字节空间数,非常麻烦 C++使用new和delete实现动态内存的分配和回收 不需要计算空间大小,可以通过类型名自动计算并分配合适空间大小 示例:动态分配和释放单个数据的存储区 #include<iostream> using namespace std; int main() { int *p; p=new int; if(p==NULL) cout<<"Allocation failure!"<<endl; else { *p=15; cout<<*p; delete p; } return 0; } //或者直接在创建的时候赋值p=new int(15); p=new int(98.5) 不会报错,会自动把98

动态内存与智能指针

*爱你&永不变心* 提交于 2019-12-27 21:37:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 1.生命周期 全局对象: 程序启动时分配,程序结束时销毁 局部自动对象: 执行流进入其定义的块时分配,执行流退出其定义的块时销毁 局部static对象: 程序启动时分配(但在其定义的块或作用域内起作用),程序结束时销毁 动态分配的对象: 生命周期与创建地点无关,只有当显示的被释放时,才会被销毁 智能指针:标准库定义,用于管理动态分配的内存,当一个对象应该被释放时,指向它的智能指针可以确保自动的释放它 2.内存分类 静态内存: 用于存储局部static对象、类的static数据成员、全局变量 栈内存: 用于存储局部非static对象 堆内存(内存池): 用于存储动态分配的对象——动态分配的对象,其生命周期由程序控制,例如使用new或delete 3.动态内存 动态内存使用过程中容易产生的问题 内存泄露: 使用后忘记释放内存 引用非法内存: 在尚有指针引用内存的情况下就释放它 使用动态内存的原因: 程序不知道自己需要使用多少对象 程序不知道所需对象的准确类型 程序需要在多个对象间共享底层数据——若两个对象共享底层数据,当某个对象销毁时,我们不能单方面的销毁底层数据 4.智能指针 智能指针和常规指针直接的区别:智能指针能够自动释放所指向的内存(类似java中的垃圾回收机制),而常规指针不能。

C++ 内存解析

核能气质少年 提交于 2019-12-27 12:16:20
一、内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在 程序编译的时 候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用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都存在于栈区的

动态内存分配(new)和释放(delete)

北城余情 提交于 2019-12-26 11:01:30
在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么该怎么办呢? 答案是 动态内存分配 (dynamic memory),为此C++ 集成了操作符 new 和 delete 。 1. new 和 new [] 操作符 动态内存分配用操作符 new 。new 后面跟一个数据类型,如果要求的元素多于一个,需要加上 [], 元素数量放在 [] 中。它返回一个指向内存块开始位置的指针。语法是: pointer = new type pointer = new type [number_of_elements] 第一个表达式为数据类型为 ‘type’ 的 一个 元素分配内存地址。第二个表达式为数据类型为 ‘type’ 的 一组 元素分配一块内存,其中 number_of_elements 是整数型,表示元素的个数。例如: int* foo; foo = new int[5]; 在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给foo。因此,现在foo 指向一块可存储5个整型元素的合法的内存空间,如下图所示。 这里,foo 是一个指针,foo指向的第一个元素可以通过语句

C程序的内存分配及动态内存

走远了吗. 提交于 2019-12-25 02:56:02
1、程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局 部变量、 函数参数、 返回数据、 返回地址等。 其操作方式类似于数据结构中的 栈。 2)堆区(heap) — 一般由程序员分配释放, 若程序员不释放, 程序结束 时可能由OS回收,否则程序就会存在内存泄漏的问题 。 分配方式类似于链表。 3)全局区(静态区) (static) —存放全局变量、 静态数据、 常量。 程序结 束后由系统释放。 4)文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 5) 程序代码区—存放函数体(类成员函数和全局函数) 的二进制代码 内存分配方式有三种: 1)从静态存储区域分配: 内存在程序编译的时候就已经分配好, 这块内存在程序的整个运行期 间都存在。 例如全局变量, static 变量。 2)在栈上创建: 在执行函数时, 函数内局部变量的存储单元都可以在栈上创建, 函数 执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器 的指令集中, 效率很高, 但是分配的内存容量有限。 3)从堆上分配: 亦称动态内存分配。 程序在运行的时候用 malloc 或 new 申请任意多少的内存, 程序员自己负责在何时用 free 或 delete 释放内存。 动态内存的生存期由程序员决定,

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符

谁说胖子不能爱 提交于 2019-12-23 10:00:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函 数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例7-8。 class Obj{ public : Obj(void){ cout << “Initialization” << endl; } ~Obj(void){ cout << “Destroy” << endl; } void Initialize(void){ cout << “Initialization” << endl; } void Destroy(void){ cout << “Destroy” << endl; }}; void

C++定义未知元素个数的数组

£可爱£侵袭症+ 提交于 2019-12-22 01:22:02
1、使用动态内存分配方法 c++申请动态内存: int arraySize; //定义元素个数 cin>>arraySize; //输入元素个数 int *p; //指针指向一个数组 p = new int[arraySize]; //动态分配内存 ... delete []p; //最后释放内存空间 c语言申请动态内存: int arraySize; //定义元素个数 scanf("%d",&arraySize);//输入元素个数 int *p; //指针指向一个数组 p = (int *)malloc(arraySize *sizeof(int)) //动态分配内存 ... free(p); //最后释放内存空间 2、使用向量vector Vector是C++STL中提供的向量 向量的大小可以动态改变 向量可以通过下标访问元素 可以通过push_back向向量中添加元素并改变大小 #include <vector> vector <int> myArray; //可以根据数据需求用 myArray.push_back(整数);来添加元素 //可以通过下标访问向量元素 ———————————————— 版权声明:本文为CSDN博主「Felix_CY」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn

delete new malloc free

一曲冷凌霜 提交于 2019-12-17 06:02:31
相同点 :都可用于申请动态内存和释放内存 不同点 : (1) 操作对象有所不同 。 malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。 (2)用法上也有所不同 。 函数malloc 的原型如下: void * malloc(size_t size); 用malloc 申请一块长度为length 的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。 1、malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。 2、 malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。 函数free 的原型如下: void free( void * memblock ); 为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p