iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++全面覆盖内存管理知识讲解
  • 724
分享到

C++全面覆盖内存管理知识讲解

2024-04-02 19:04:59 724人浏览 薄情痞子
摘要

目录前言一、c++内存管理方式1.1new/delete操作内置类型二、operator new与operator delete函数2.1operator new与oper

前言

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

一、C++内存管理方式

1.1new/delete操作内置类型

void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]

二、operator new与operator delete函数

2.1operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。


void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
// try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{
// report no memory
// 如果申请内存失败了,这里会抛出bad_alloc 类型异常
static const std::bad_alloc nomem;
_RaiSE(nomem);
}
return (p);
}

void operator delete(void *pUserData)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
_mlock(_HEAP_LOCK); 
__TRY

pHead = pHdr(pUserData);

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
_free_dbg( pUserData, pHead->nBlockUse );
__FINALLY
_munlock(_HEAP_LOCK); 
__END_TRY_FINALLY
return;
}

#define free(p) _free_dbg(p, _NORMAL_BLOCK)

通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

二、new和delete的实现原理

2.1内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

2.2 自定义类型

new的原理

  • 调用operator new函数申请空间
  • 在申请的空间上执行构造函数,完成对象的构造

delete的原理

  • 在空间上执行析构函数,完成对象中资源的清理工作
  • 调用operator delete函数释放对象的空间

new T[N]的原理

  • 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
  • 在申请的空间上执行N次构造函数

delete[]的原理

  • 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
  • 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

到此这篇关于C++全面覆盖内存管理知识讲解的文章就介绍到这了,更多相关C++内存管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++全面覆盖内存管理知识讲解

本文链接: https://www.lsjlt.com/news/151857.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++全面覆盖内存管理知识讲解
    目录前言一、C++内存管理方式1.1new/delete操作内置类型二、operator new与operator delete函数2.1operator new与oper...
    99+
    2024-04-02
  • C语言超全面覆盖操作符知识点
    目录算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符算术操作符 主要是 (+ - * / %) 五种算数操作符。 1、除了 % 操作符之外,其他的几个操...
    99+
    2024-04-02
  • 浅谈C++内存管理基础知识
    目录概述c++可用内存c语言的可用内存c++新增内存区域new和malloc智能指针引入智能指针的实现java延伸java语言整体框架java的垃圾回收机制总结 概述 内存管理的原理...
    99+
    2024-04-02
  • C/C++深入讲解内存管理
    目录C/C++内存分布C语言中的动态内存管理C++的内存管理operator new与operator delete函数operator new与operator dele...
    99+
    2024-04-02
  • C++内存管理的知识点有哪些
    这篇文章主要讲解了“C++内存管理的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++内存管理的知识点有哪些”吧!1. 简述下C++的内存分配方式。在C++中,内存可以分为 5...
    99+
    2023-07-05
  • C语言 动态内存管理全面解析
    目录1. 为什么存在动态内存分配2. 动态内存函数的介绍2.1 malloc和free2.2 calloc 2.3 realloc3. 常见的动态内存错误3.1 对NULL...
    99+
    2024-04-02
  • C#内存管理CLR深入讲解(上篇)
    半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存...
    99+
    2024-04-02
  • C#内存管理CLR深入讲解(下篇)
    《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域...
    99+
    2024-04-02
  • C++详细讲解内存管理工具primitives
    目录primitivesnew 和 deleteplacement new重载 operator newper-class allocatorNew Handler=default,...
    99+
    2024-04-02
  • Java内存区域与内存溢出异常知识讲解
    本篇内容介绍了“Java内存区域与内存溢出异常知识讲解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文一. 基本概念在开始讲解之前, 需要...
    99+
    2023-06-05
  • C++图文并茂分析讲解内存管理
    目录1.了解一些基本的内存段(图演示)验证栈是向下生长的验证堆一般是向上生长的(不一定)巩固内存管理知识点答案2.c++申请动态内存的新玩儿法new,delete回顾c语言动态内存管...
    99+
    2024-04-02
  • Linux内存管理的知识点有哪些
    这篇文章主要介绍“Linux内存管理的知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux内存管理的知识点有哪些”文章能帮助大家解决问题。1 前言内存管理是Linux内核中非常重要的...
    99+
    2023-06-16
  • 面试必备:Java 缓存知识全面解析!
    Java 缓存在面试中是一个非常重要的话题,因为它是提高应用程序性能的一个重要手段。本文将全面解析 Java 缓存的知识,为你在面试中更好地回答相关问题提供帮助。 一、什么是缓存? 缓存是一种提高程序性能的技术,它通过将常用的数据存储在快速...
    99+
    2023-10-06
    缓存 学习笔记 面试
  • 详解C/C++内存管理
    目录C/C++内存分布C语言中动态内存管理方式C++中动态内存管理方式new和delete操作内置类型new和delete操作自定义类型operator new和operator d...
    99+
    2024-04-02
  • 你必须知道的 PHP 中的内存管理知识
    内存管理是 PHP 编程的一个重要方面,它可以极大地影响应用程序的性能和可伸缩性。 它涉及理解内存分配模型,通过高效的编程技术最大限度地减少内存使用,以及利用缓存和延迟加载等优化策略。 为了有效地管...
    99+
    2024-02-27
  • C/C++内存管理基础与面试
    目录1.C/C++内存分布2.C语言中动态内存管理方式3.C++中动态内存管理方式3.1 对于内置类型3.2 对于自定义类型3.3 new的底层原理4. 常见的面试题1.C/C++内...
    99+
    2024-04-02
  • Java虚拟机内存管理知识有哪些
    这篇文章主要讲解了“Java虚拟机内存管理知识有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java虚拟机内存管理知识有哪些”吧!0、Java 对内存的划分:Java虚拟机规范将物理内...
    99+
    2023-06-04
  • C语言深入细致讲解动态内存管理
    目录为什么存在动态内存管理动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用fr...
    99+
    2024-04-02
  • c++动态内存管理与智能指针的相关知识点
    目录引言一、介绍二、shared_ptr类make_shared函数shared_ptr的拷贝和引用shared_ptr自动销毁所管理的对象…使用动态生存期的资源的类应...
    99+
    2024-04-02
  • C++内存管理如何理解
    这期内容当中小编将会给大家带来有关C++内存管理如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言;C++继承了C语言的指针,一直以来指针的一些问题困扰着开发人员,常见的指针问题主要有:内存泄露、...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作