动态内存

C++ 之 智能指针 知识点

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

C++内存详解[精]

你离开我真会死。 提交于 2019-11-28 12:53:15
伟大的Bill Gates 曾经失言:   640K ought to be enough for everybody — Bill Gates 1981   程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。   1、内存分配方式   内存分配方式有三种:    (1) 从静态存储区域分配 。内存在程序编译的时候就已经分配好, 这块内存在程序的整个运行期间都存在 。例如全局变量,static变量。   (2) 在栈上创建 。在执行函数时,函 数内局部变量的存储单元都可以在栈上创建,函数 执行结束时这些存储单元自动被释放 。栈内存分配运算 内置于 处理器的指令集中,效率很高 ,但是分配的内存 容量有限 。   (3) 从堆上分配 ,亦称 动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存 ,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。   2、常见的内存错误及其对策   发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来

小结《malloc与new之区别》

北城余情 提交于 2019-11-28 02:11:34
1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存 2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。 5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。 CPP代码 class Obj { public : Obj( void ){ cout << “Initialization” << endl; } ~ Obj( void ){ cout << “Destroy” << endl; } void Initialize( void ){ cout << “Initialization” << endl; } void Destroy( void ){

c语言学习笔记-动态内存分配

柔情痞子 提交于 2019-11-27 21:48:55
以下内容均为看郝斌老师视频和教学大纲,总结,复制粘贴而来的笔记。 动态内存分配   传统数组的缺点     1.传统数组必须事先制定,且只能是常整数,不能是变量     2.传统形式定义的数组,该数组的内存程序员无法手动释放,在一个函数的运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放     3.数组的长度一旦定义,其长度就不能在更改,数组的长度不能在函数运行过程中动态的扩充或缩小     4.传统方式定义的数组不能跨函数使用 为什么需要动态分配内存   动态数组很好的解决了传统数组的这4个缺陷   传统数组也叫静态数组 分配动态内存举例 int * p=(int *)malloc(int len) 释放动态内存的方法 free(p) 静态内存和动态内存的比较     静态内存是由系统自动分配,由系统自动释放     静态内存是在栈分配的          动态内存是由程序员手动分配,手动释放     动态内存是在堆分配的 跨函数使用内存的问题     静态内存不可以跨函数使用     静态内存在函数执行期间可以被其他函数使用     静态内存在函数执行完毕之后就不能再被其它其他函数使用了     动态内存可以跨函数使用       动态内存在函数执行完毕之后仍然可以被其他函数使用 来源: https://www.cnblogs

C++中内存分配详解

余生颓废 提交于 2019-11-26 17:38:58
转载自51CTO.com http://developer.51cto.com/art/201107/276154.htm 我们都知道,内存基本上分为静态存储区、堆区和栈区三大部分。本文介绍的是C++中的内存分配的问题,希望对你有帮助,一起来看。 程序运行时,特别要注意的是内存的分配。下面介绍 C++ 程序设计中的 内存分配 。 一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。 例一

C++的多态与切片问题(Section Problem)

回眸只為那壹抹淺笑 提交于 2019-11-26 17:38:53
C++内存分配的方式大体上可以归纳为3种 1) 从静态存储区中分配:内存在编译时就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量 2) 在栈上分配:执行函数时,函数内局部变量的存储单元都可在栈上创建,函数执行结束时,这些存储单元自动被释放 3) 在堆上分配:也称为动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,除非程序运行结束或者程序员自己用free或delete释放动态内存,否则这块动态内存一直存在 多态性是指为一个函数名关联多种含义的能力,即同一种调用方式可以映像到不同的函数。这种把函数的调用与适当的函数体对应的活动又称为绑定(binding)。根据绑定所进行阶段的不同,可分为早期绑定(early binding)、晚期绑定(late binding),早期绑定发生在程序的编译阶段,称为静态联编(static binding),晚期绑定发生在程序的运行阶段,称为动态联编(dynamic binding)。 1) 早期绑定(Early Binding):也称为编译期多态,指绑定是发生在编译阶段。 1 // : Poly.cpp 2 #include <iostream> 3 4 using namespace std; 5 6 class A { 7 public : 8 A() : x( 5 ) {} 9 virtual

C++中内存分配详解

房东的猫 提交于 2019-11-26 17:38:45
转载自51CTO.com http://developer.51cto.com/art/201107/276154.htm 我们都知道,内存基本上分为静态存储区、堆区和栈区三大部分。本文介绍的是C++中的内存分配的问题,希望对你有帮助,一起来看。 程序运行时,特别要注意的是内存的分配。下面介绍 C++ 程序设计中的 内存分配 。 一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。 二、三者之间的区别 我们通过代码段来看看对这样的三部分内存需要怎样的操作和不同,以及应该注意怎样的地方。 例一