C++内存管理详解使用方式
目录
- c++中内存管理的方式
- new和delete操作符的使用方式
- operator new和operator delete函数
- new和delete的原理内部实现
- 内置类型
- 自定义类型
c++中内存管理的方式
在c语言中,我们拥有malloc和free等函数可以对内存进行动态管理
但是总体来说不是很方便,所以c++拥有了一种新的方式来对内存进行管理:通过new和delete操作符来对内存进行动态分配
new和delete操作符的使用方式
new操作符的使用方式:
#include<iostream> using namespace std; class A {}; int main() { int* p = new int(2); //动态分配一个int类型的空间,还可以将它初始化 int* p1 = new int[10]; //动态分配一个数组 A* p2 = new A; //动态分配一个类 return 0; }
delete操作符的使用方式:
#include<iostream> using namespace std; class A {}; int main() { int* p = new int(2); int* p1 = new int[10]; A* p2 = new A; delete p; //销毁p delete[] p1; //销毁p1 delete p2; //销毁p2 return 0; }
注意:
1、对于自定义类型,new和delete会自动调用构造函数和析构函数对创建出的对象进行初始化,也可以显示的写出想要被初始化的值,而malloc和free不会
#include<iostream> using namespace std; class A { public: A(int x = 1) :_x(x) {} private: int _x; }; int main() { A* p = new A(2); //()括号内为显示的给对象初始化的值 return 0; }
2、假如要销毁数组类的内容,最好使用[]来修饰一下,因为虽然对于内置类型不会报错,但是自定义类型会直接报错
operator new和operator delete函数
new和delete是用户进行动态内存申请和释放的操作符
operator new 和operator delete是系统提供的全局函数
new在底层调用operator new全局函数来申请空间
delete在底层通过operator delete全局函数来释放空间
最终还是通过malloc和free来进行动态内存分配,不过和c不同的是,c++空间申请失败,会出现抛异常的情况,而不是返回NULL
new和delete的原理内部实现
内置类型
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL
自定义类型
如果是自定义类型,就有很大区别了
new的原理
1、调用operator new申请空间,
2、调用构造自定义类型的构造函数进行初始化
delete的原理
1、调用operator delete释放空间
2、调用自定义类型的析构函数进行初始化
所以我们使用c++的时候最好使用new和delete进行动态内存开辟,因为这样可以更方便进动态内存管理,防止内存泄露
到此这篇关于C++内存管理详解使用方式的文章就介绍到这了,更多相关C++内存管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++的动态内存管理你真的了解吗
目录 前言 用法上 对内置类型 对自定义类型 new/delete底层原理 重载类的专属operatornew和operatordelete 定位new new/delete与malloc/free区别总结 内存泄漏 总结 前言 想必大家对c语言的动态内存分配并不陌生,忘了的小伙伴也可以看看我的这篇文章C语言动态内存分配 c语言的动态内存分配由于有些地方用起来比较麻烦同时检查错误的机制不适合c++,因此c++引入new/delete操作符进行内存管理,下面我们来深入探讨c++为什么要引入new/
-
C++内存管理之简易内存池的实现
目录 什么是内存池? 它的实现过程为: 初步实现 使用嵌入指针改进 更简化:static allocator macor for static allocator 什么是内存池? 频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存,当有内存申请需求时,从内存池中取出一块内存分配给目标对象. 它的实现过程为: 预先申请 chunk 大小的内存池, 将内存池划按照对象大小划分成多个内存块.以链表的形式,即通过指针将内存块相连,头指针指向第一个空
-
一起来学习C++的动态内存管理
目录 1.new和delete 2.new和delete在底层是怎么实现的: 2.1new底层的实现: 我们先来new一个test类型的空间. 2.2delete底层的实现: 我们执行delete语句,转到反汇编来 2.3new []底层的实现: 2.4delete []的实现: 3.重载new和delete 4.定位new: 5.内存检测函数:_CrtDumpMemoryLeaks(); 总结 1.new和delete C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来
-
C++内存管理介绍
目录 1 smart_ptr概述 1.1 RAII进制 1.2 智能指针 1.3 scoped_ptr 1.4 scoped_array 1.6 shared_array 1.7 weak_ptr弱指针 2 总结 前言; C++继承了C语言的指针,一直以来指针的一些问题困扰着开发人员,常见的指针问题主要有:内存泄露.野指针.访问越界等.值得庆幸的是C++标准委员会给我们提供了auto_ptr智能指针,后面又引入了share_ptr以及weak_ptr帮助我们正确和安全的使用指针,本文主要是介绍b
-
c++动态内存管理与智能指针的相关知识点
目录 引言 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象… 使用动态生存期的资源的类 应用举例:Blob类 定义Blob类 StrBlob的拷贝.赋值和销毁 三.直接管理内存 使用new分配内存 使用new动态分配和初始化对象 动态分配const对象 内存耗尽 使用delete释放内存 基本介绍 举例 四.shared_ptr和new结合使用 new直接初始化share_ptr 初始化时传入可调用对象
-
c++动态内存管理详解(new/delete)
目录 前言 用法上 对内置类型 对自定义类型 new/delete底层原理 重载类的专属operatornew和operatordelete 定位new new/delete与malloc/free区别总结 内存泄漏 总结 前言 想必大家对c语言的动态内存分配并不陌生,忘了的小伙伴也可以看看我的这篇文章C语言动态内存分配 c语言的动态内存分配由于有些地方用起来比较麻烦同时检查错误的机制不适合c++,因此c++引入new/delete操作符进行内存管理,下面我们来深入探讨c++为什么要引入new/
-
C/C++指针与内存管理图文详解
目录 一.指针 二.数组 总结 指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又绕不开的地方,特别在下位机上,会频繁的与指针打交道,如果概念模糊,一不小心就会写出冗余的代码,可能会引起多余内存开销或者直接影响运行速度. 一.指针 1.计算机内存主要分成这几个区,每个区又分成无数个字节(Byte),每个字节(Byte)都有唯一的编号,而这个编号就这个字节的指针地址.一般程序能读写的区域只有全局变量.堆区.栈区.下面是计算机内存的示意图: 每个字节(Byte)对应的编号地址
-
C/C++的内存管理你了解嘛
目录 C/C++内存分布 C语言中动态内存管理方式 C++ 内存管理方式 new和delete操作自定义类型 new和delete的实现原理 1.内置类型 2.自定义类型 malloc/free和new/delete的区别 总结 C/C++内存分布 int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = {
-
C++内存管理详解使用方式
目录 c++中内存管理的方式 new和delete操作符的使用方式 operator new和operator delete函数 new和delete的原理内部实现 内置类型 自定义类型 c++中内存管理的方式 在c语言中,我们拥有malloc和free等函数可以对内存进行动态管理 但是总体来说不是很方便,所以c++拥有了一种新的方式来对内存进行管理:通过new和delete操作符来对内存进行动态分配 new和delete操作符的使用方式 new操作符的使用方式: #include<iostre
-
JVM内存管理之JAVA语言的内存管理详解
引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不
-
C语言与C++中内存管理详解
目录 内存分布 动态内存管理方式-堆区 C语言动态内存管理 C++动态内存管理 new和delete的用法 operator new与operator delete函数 new和delete的实现原理 定位new表达式 高频面试题 重点new/delete和malloc/free的区别 内存泄漏 内存分布 主要段及其分布 每个程序运行起来以后,它将拥有自己独立的虚拟地址空间.这个虚拟地址空间的大小与操作系统的位数有关系.32位硬件平台的虚拟地址空间的地址可以从0~2^32-1,即0x0000
-
Python深入06——python的内存管理详解
语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征.这里以Python语言为例子,说明一门动态类型的.面向对象的语言的内存管理方式. 对象的内存使用 赋值语句是语言最常见的功能了.但即使是最简单的赋值语句,也可以很有内涵.Python的赋值语句就很值得研究. a = 1 整数1为一个对象.而a是一个引用.利用赋值语句,引用a指向对象1.Python是动态类型的语言(参考动态类型),对象与引用分离.Python
-
C++动态内存管理详解
目录 1.C/C++程序地址空间 2.C语言动态内存管理 (1)malloc (2)calloc (3)realloc (4)free 3.C++动态内存管理 (1)C++为什么要设计一套自己专属的动态内存管理方式? (2)new/delete定义 1)new/delete操作内置类型 2)new/delete操作自定义类型 (3)new/delete的实现原理 4.malloc/free和new/delete的区别 共同点: 不同点: 5.内存泄漏 总结 1.C/C++程序地址空间 计算机物理
-
javascript的内存管理详解
介绍 低层次的语言,如C,具有低级别的内存管理命令,如:malloc()和free(),需要开发者手工释放内存.然而像javascript这样的高级语言情况则不同,对象(objects, strings 等)创建的时候分配内存,当他们不在使用的时候内存会被自动回收,这个自动回收的过程被称为垃圾回收.因为垃圾回收的存在,让javascript等高级语言开发者产生了一个错误的认识,以为可以不用关心内存管理. 内存生命周期 不管什么样的编程语言,内存的生命周期基本上是一致的. 1.分配你需要的内存 2
-
Python中的内存管理之python list内存使用详解
前言 使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的拓展其中的元素个数. 也可以使用运算符 如: [1] + [2] 生成新的数组[1, 2] extend(). "+"."+=" 的区别 "+"将两个 list 相加,会返回到一个新的 list 对象 append 在原 list 上进行修改,没有返回值 从以下代码可以看到, 调用 b = b + [3,
-
Java程序执行过程及内存机制详解
本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和方法区都各自负责存储哪些内容.最后用一小块代码示例来帮助理解Java程序运行时内存的变化. Java程序执行过程 步骤 1: 写源代码,源代码将以.java的文件格式保存在电脑硬盘中. 步骤 2: 编译器(compiler)检查是否存在编译期错误(例如缺少分号,关键字拼写错误等).若通过检测,编译器
-
C++ 类中有虚函数(虚函数表)时 内存分布详解
虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,保证其容真实反应实际的函数.这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数. 这里我们着重看一下这张虚函数表.C++的编译器应该是
随机推荐
- jsp页面获取服务器时间的简单调用示例
- vue组件间通信解析
- 正则表达式30分钟入门教程 v2.1版
- java实现读取、删除文件夹下的文件
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS之Cocoapods安装教程(全面解析)
- Drupal7连接多个数据库及常见问题解决
- PHP中array_merge和array相加的区别分析
- 【Java】BigDecimal实现加减乘除运算代码
- EL表达式入门必看篇(推荐)
- java 数据结构中栈结构应用的两个实例
- ORACLE 系统函数大全SQLSERVER系统函数的异同
- js控制CSS样式属性语法对照表
- jQuery实现移动端Tab选项卡效果
- ExtJS与PHP、MySQL实现存储的方法
- Win 2003系统也玩图片收藏屏保
- Java获取时间年、月、日的方法
- JAVA 生成随机数并根据后台概率灵活生成的实例代码
- 设计模式中的原型模式在Python程序中的应用示例
- C#抓取当前屏幕并保存为图片的方法