C/C++内存管理(2):`new`和`delete`的实现原理

简介: C/C++内存管理(2):`new`和`delete`的实现原理

newdelete操作自定义类型

class Stack
{
public:
  Stack(int capacity = 3)
    :_top(0)
    , _capacity(capacity)
  {
    cout << "Stack(int capacity = 3)" << endl;
    _a = new int[capacity];
  }
    
  ~Stack()
  {
    cout << "~Stack()" << endl;
    delete _a;
    _top = _capacity = 0;
  }
private:
  int* _a;
  int _top;
  int _capacity;
};

int main()
{
  Stack* s1 = new Stack;
  delete s1;

  return 0;
}

  • new:开对象空间+调用构造函数
  • delete:调用析构函数+释放对象空间

一、operator newoperator delete函数

1.1

operator newoperator delete是系统提供的全局函数new通过调用operator new申请空间,delete通过调用operator delete释放空间

int main()
{
    Stack* s1 = (Stack*)operator new(sizeof(Stack));
    operator delete(s1);
    
    return 0;
}

实际上,operator new通过malloc申请空间,operator delete通过free释放空间

二、newdelete实现原理

2.1 内置类型

申请内置类型空间时,new/deletemalloc/free基本类似。

new/delete申请和释放的是单个元素的空间,new[]/delete[]申请和释放的是连续空间。new申请失败会抛异常,malloc则返回NULL

2.2 自定义类型

T为某一种类

  • new T:1. 调用operator new函数申请空间 2. 在已申请空间上调用构造函数,完成对象的构造。
  • delete:1. 调用析构函数,完成对象资源清理 2. 调用operator delete 释放空间。
  • new T[N]:1. 调用operator new[] 2. 在operator new[]过程中,实际调用operator new完成对 N 个对象空间的申请 3. 在申请的空间上执行 N 次构造
  • delete[]:1. 在申请空间上完成 N 次析构 2. 调用operator delete[] 3. 实际调用operator delete释放空间。

三、定位new表达式

3.1 概念

定位new表达式,指在已分配的内存空间上调用构造函数初始化对象

格式: new(地址)type(已有默认构造可以不传参)或 new(地址)type(初始化列表)

int main()
{
  Stack* s1 = (Stack*)operator new(sizeof(Stack));
  new(s1)Stack(2);// new(地址)type(初始化列表)

  delete s1;
  return 0;
}

四、总结malloc/freenew/delete的区别

共同点:

都是从堆上申请空间,且需要用户手动释放。

4.1 用法上
  1. malloc/free是函数,new/delete是操作符
  2. malloc申请的空间无法初始化,new可以初始化。
  3. malloc申请空间时需要手动计算大小并传递;new只需要+申请空间的类型即可,多个对象,在[]中指明个数。
  4. malloc的返回值类型是void*,需要强制转换,new不需要。
  5. malloc申请空间失败返回NULL,需要 ”判空 “;new需要捕获异常。
4.2 原理上
  1. 申请自定义类型空间时,malloc/free不会调用构造函数和析构函数;new/delete可以。
相关文章
|
4月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
187 26
|
9月前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
5月前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
105 1
|
8月前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
211 3
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
157 0
【C++打怪之路Lv6】-- 内存管理
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1589 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
466 1
|
4月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
441 0

热门文章

最新文章

下一篇
oss云网关配置