深入理解C++中的new/delete和malloc/free动态内存管理
malloc/free和new/delete的区别
- malloc/free是C/C++标准库的函数;new/delete是C++操作符。
- malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。
- malloc/free需要手动计算类型大小且返回值类型为
void*;new/delete可自动计算类型的大小,返回对应类型的指针。 - malloc/free管理内存失败会返回0;new/delete等的方式管理内存失败会抛出异常。
在C++ Primer书中有提到说: new/delete的表达式与标准库函数同名了,所以系统并没有重载new或delete表达式。new/delete真正的实现其实是依赖下面这几个内存管理接口的。
void *operator new(size_t); //allocate an object
void *operator delete(void *); //free an object
void *operator new[](size_t); //allocate an array
void *operator delete[](void *); //free an array
malloc/free和new/delete的底层实现
new的底层实现
// new.cpp
#include <cstdlib>
#include <new>
_C_LIB_DECL
int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL
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
_THROW_NCEE(_XSTD bad_alloc, );
}
return (p);
}
delete的底层实现
#include <cruntime.h>
#include <malloc.h>
#include <new.h>
#include <windows.h>
#include <rtcsup.h>
void operator delete( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0));
free( p );
}
new[]的底层实现
#include <new>
void *__CRTDECL operator new[](size_t count) _THROW1(std::bad_alloc)
{ // try to allocate count bytes for an array
return (operator new(count));
}
delete[]的底层实现
#ifdef CRTDLL
#undef CRTDLL
#endif
#ifdef MRTDLL
#undef MRTDLL
#endif
#define _USE_ANSI_CPP // suppress defaultlib directive for Std C++ Lib
#include <new>
extern void __CRTDECL operator delete[](void *ptr) _THROW0();
void __CRTDECL operator delete[](void *ptr,
const std::nothrow_t&) _THROW0()
{ // free an allocated object
operator delete[](ptr);
}
malloc/free和new/delete的执行过程
new的执行过程
new(int size) --> operator new() --> malloc() --> constructor function --> return ptr
delete的执行过程
delete ptr --> destructor function --> operator delete() --> free
new[]的执行过程
new[count] --> operator new[]() --> operator new() --> malloc() --> constructor function --> return ptr
delete[]的执行过程
delete[] ptr --> destructor function --> operator delete[]() --> operator delete() --> free
- 依次调用指针指向对象数组中每个对象的析构函数
- 调用
operator delete[](),operator delete[]()再调用operator delete - 底层用free执行
operator delete表达式,依次释放内存 operator delete[]()数组的个数存放在指针的前4位
参考
深入理解C++中的new/delete和malloc/free动态内存管理的更多相关文章
- C++中,new/delete和malloc/free的区别
1.new/delete是C++的操作符,而malloc/free是C中的函数. 2.new做两件事,一是分配内存,二是调用类的构造函数:同样,delete会调用类的析构函数和释放内存.而malloc ...
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...
- 动态内存管理---new&delete
动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. ...
- C++中对C的扩展学习新增语法——动态内存管理
1.C语言动态内存管理的缺点: 1.malloc对象的大小需要自己计算. 2.需要手动转换指针类型. 3.C++的对象不适合使用malloc和free. 2.C++中new/delete基本使用: 3 ...
- 动态内存管理:malloc/free/new/delete/brk/mmap
这是我去腾讯面试的时候遇到的一个问题——malloc()是如何申请内存的? c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, c ...
- 深入理解C++ new/delete, new []/delete[]动态内存管理
在C语言中,我们写程序时,总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free 去从堆里面动态申请出来一段内存给我们用.但对这一块申请出来的内存,往往还需要我们对它进行稍许的“ ...
- C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)
C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...
- C++—动态内存管理之深入探究new和delete
C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为自由空间(free store)或堆(heap).程序用堆来存储动态分配的对象,即,那些程序运行时分配的对象.动态对象 ...
- C++动态内存管理之深入探究new和delete
C++中程序存储空间除栈空间和静态区外,每个程序还拥有一个内存池,这部分内存被称为自由空间(free store)或堆(heap).程序用堆来存储动态分配的对象,即,那些程序运行时分配的对象.动态对象 ...
随机推荐
- luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治
LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...
- CustomPlot 在Qt下 鼠标点击曲线 显示当前坐标
此次记录主要是为了下次使用时能回忆起来才做得笔记,若有需改进的地方,请不吝珠玉. widget.cpp #include "widget.h" #include "ui_ ...
- Python预测2020高考分数和录取情况
“迟到”了一个月的高考终于要来了. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识. ...
- CentOS yum 安装nginx
当使用以下命令安装Nginx时,发现无法安装成功 yum install -y nginx 需要做一点处理. 安装Nginx源 执行以下命令: rpm -ivh http://nginx.org/pa ...
- 朴素贝叶斯算法java实现(多项式模型)
网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...
- 2020重新出发,JAVA语言,JAVA的诞生和发展史
java的诞生 在1991年时候,James Gosling在Sun公司的工程师小组想要设计这样一种主要用于像电视盒这样的消费类电子产品的小型计算机语言. 这些电子产品有一个共同的特点:计算处理能力和 ...
- Vue组件通信之父传子
一般情况下,子组件中无法直接使用父组件的变量.借助子组件的props选项可以实现这一点. 这里我将一个vue实例作为一个父组件: const app = new Vue({ el:'#div1', d ...
- Q#–一个新年愿望清单
本文章为机器翻译.https://blogs.msdn.microsoft.com/visualstudio/2018/12/24/qsharp-wish-list-for-new-year/# 在以 ...
- C#设计模式之3-建造者模式
建造者模式(Builder Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/393 访问. 建造者模式属 ...
- C#算法设计排序篇之02-快速排序(附带动画演示程序)
快速排序(Quick Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/677 访问. 快速排序由C. A. R ...